4

尝试为我的向量定义一个查找函数,因为该向量包含多个数据;它是一个结构的向量

我正在输入一个 ID,并试图在我的表中搜索它并找到它的索引(如果该 ID 已经存在)

所以我在这里有声明:

vector<Employee> Table;
vector<Employee>::iterator It;
vector<Employee>::iterator find_It;

//Table has these values
//Table.ID, Table.ch1, Table.ch2

我正在尝试在这里找到 ID:

cin >> update_ID;
find_It = find(Table.begin(), Table.end(), update_ID);

有没有办法使用变量 update_ID 进行查找?

我试过这样做:

find_It = find(Table.begin(), Table.end(), (*It).update_ID;

但显然我的向量 Employee 没有名为 update_ID 的数据成员

我想做的另一个选择是创建自己的 find 函数,我对如何定义有点困惑

我想返回 ID 的索引,其中 Table.ID = update_ID

我将什么作为返回类型和值参数?是吗

returntype find( Iterator, Iterator, update ID)
{ 
    for (vector<Employee>::iterator myit = Table.begin(), Table.end(), myit++)
    {
        if update_ID == Table.ID
        {
            return myit;
        }
    }
    return myit
}
4

4 回答 4

5

C++ 标准库带有一组查找函数

您正在寻找find_ifwhich 需要一个指定比较的函子。

// a functor taking the update_ID you 
// are looking for as an argument in the constructor
struct myfind {
  myfind(int needle) : needle(needle) {}

  int needle;
  bool operator()(const Employee& x) {
    return x.ID == needle;
  }
};

// use as
int update_ID = 23;
std::find_if(begin(Table), end(Table), myfind(update_ID));

您还可以使用 lambda:

int id;
std::find_if(begin(Table), end(Table),
             [=](const Employee& x) { return x.update_ID == id; });
于 2012-12-05T23:43:43.600 回答
3

显而易见的方法是使用std::find_if()谓词。使用 C++ 2011 表示法可能如下所示:

std::vector<Employee>::iterator it(std::find_if(Table.begin(), Table.end(),
                                   [=](Employee const& e) { return e.ID == update_ID; });

如果你不能使用 C++ 2011,你可以为谓词创建一个函数对象,或者使用一个合适的函数,为update_ID.

于 2012-12-05T23:43:43.367 回答
3

你可以用std::find_if() 找出它是如何工作的

于 2012-12-06T00:05:08.993 回答
2

您可以通过使用find_if来使用自己的匹配功能。我假设在您的第一个片段中,您指的是具有成员 ID、ch1、ch2 的 Employee,而不是 Table。解决问题的一种方法是:

#include <vector>
#include<iostream>
#include<algorithm>

using std::cout;
using std::endl;
using std::vector;

struct Employee{
   int ID;
   int ch1;
   int ch2;
};

int IDmatch;

bool match_id( Employee myemp){
   return myemp.ID==IDmatch;
}

int main(){

   vector<Employee> Table;

   // fill example vector
   Employee temp; // use this for inserting structs into your vector
   for(int i=0; i<10; i++){
      temp.ID = i; // 1,2,3,...
      temp.ch1 = 10*i+1; // 11,21,32,...
      temp.ch2 = 10*i+2; // 12,22,32,...
      Table.push_back(temp);
   }

   vector<Employee>::iterator itv;
   IDmatch = 3;
   itv = find_if(Table.begin(), Table.end(), match_id);
   cout << "found an Employee with ID=" << IDmatch << ": ch1=" << itv->ch1 << ", ch2=" << itv->ch2 << endl;

}
于 2012-12-06T00:05:25.980 回答