【问题标题】:matching elements in a vector匹配向量中的元素
【发布时间】:2012-11-05 02:25:59
【问题描述】:

我想要做的是匹配允许用户输入例如 ID 并将该 ID 与某个矢量匹配并打印它。这是我的班级的样子。 (我正在尝试做一个库存计划)。

class Item{
private:
  string month;
  string name;
  int ID;
  int actual_qunatity;

public:
  void print()const;
  void report();
  void getdata();
  void setname (string itemname){name=itemname;}
  void setID(int setID){ID=setID;}
};
class Inventory{
public:
  void print2()const;
  void report();
  void getdata();
  void sale();
private:
      vector<Item>items;
};

将元素添加到向量后,我想在向量中找到一些元素并打印它。这里是

void Inventory::sale(){                                                                                                                                                               
  int ID;
  cout<<"Enter ID ";
  cin>>ID;
  vector<Item>::const_iterator it;
  it=find(items.begin(), items.end(), ID);
  ++it;
}

但我得到一个错误:没有匹配函数调用'find(std::vector::iterator, std::vector::iterator, int&)'

【问题讨论】:

    标签: c++


    【解决方案1】:

    使用 std::find_if 和 lambda 来执行搜索。

    int ID;
    cout << "Enter ID ";
    cin >> ID;
    auto it = find_if(items.begin(), items.end(), [&]( Item const& item ) {
                       return item.getID() == ID; // need to be able to access ID 
                                                // publicly
                      } );
    
    if( it != items.end() ) {
      // it points to item with matching ID
    }
    

    【讨论】:

    • 如果我在项目类中声明 getID{return ID;} 然后找到一个元素我将如何使用它?我试过这样的事情 if (it->getID() == id)
    • 声明为int getID() const {return ID;}就可以按照上面sn-p的方式使用了。
    • 谢谢,还有一个问题,如果我不为它付出成本,那么为什么在我打印项目时会出现这种情况,然后在第一个项目上打印 0,但在其他项目上,例如 4.59163e-41跨度>
    • 如果没有看到一些代码,我不能肯定地说。听起来您可能正在尝试访问超出范围或指向无效内存的内容。
    • 找到匹配的 ID 后如何更改数量?例如我使用 getquantity()const{return actual_quantity) 但然后用其他东西替换它?
    【解决方案2】:

    是的,这是因为您有一个由Item 对象组成的向量,并且您告诉它查找一个整数。您需要更改设计或简单地使用 for 循环并手动检查每个对象,如下所示:

    std::vector<Item>::const_iterator it;
    for(it = items.begin(); it != items.end(); it++) {
        if (it->ID == ID) {
            // this is your element
        }
    }
    

    【讨论】:

    • 但这表示 ID 是私有的
    • 我认为在这种情况下,虽然 ID 的吸气剂根本不会受到伤害,因此这可能是一个解决方案。否则,我的回答不好。感谢您指出!
    • 如果我在项目类中声明 getID{return ID;} 然后找到一个元素我将如何使用它?我试过这样的事情 if (it->getID() == id)
    【解决方案3】:

    要在vector&lt;T&gt; 中查找特定项目,您不能让代码猜测您要检查ID 字段。首先你需要编写一个自定义的比较运算符:

    bool operator== ( const Item &n1, const Item &n2) {
      return n1.ID == n2.ID;
    }
    

    那么你应该使用一个虚拟项目(及其构造函数)来搜索指定的项目:

    std::find(items.begin(), items.end(), Item(ID));
    

    您还可以对向量进行迭代并查找指定的 ID。或者更好的是,如果您不需要随机访问向量,请使用 map&lt;int, Item&gt;unordered_map

    【讨论】:

    • 别忘了在Item类中声明bool operator== ( const Item &amp;n1, const Item &amp;n2)为友元函数;
    • 是的,在这种情况下是肯定的,因为ID 是私有的。但是friend 访问与 OP 问题没有直接关系,这就是我避免使用它的原因。
    猜你喜欢
    • 2014-09-27
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2022-09-28
    • 2017-02-16
    相关资源
    最近更新 更多