0

私がしたいのは、ユーザーがたとえば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&)' の呼び出しに一致する関数はありません

4

3 に答える 3

3

std::find_ifとラムダを使用して検索を実行します。

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
}
于 2012-11-05T02:40:17.250 に答える
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
    }
}
于 2012-11-05T02:30:50.200 に答える
2

内の特定のアイテムを探すために、フィールドvector<T>をチェックしたいことをコードに推測させることはできません。IDまず、カスタム比較演算子を記述する必要があります。

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

次に、指定された項目を検索するためにダミー項目 (コンストラクターを使用) を使用する必要があります。

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

ベクターを繰り返し処理して、指定された ID を探すこともできます。または、ベクトルへのランダムアクセスが必要ない場合は、map<int, Item>またはを使用してください。unordered_map

于 2012-11-05T02:31:00.097 に答える