C++如何使find_if不仅返回应用pred的第一个对象为true

del*_*316 2 c++ algorithm stl

这意味着允许用户输入他/她希望搜索的姓名,联系人和地址.我想要做的是显示所有应用pred的对象是真的,但我似乎无法让它工作.

static string searchName, searchContact, searchAddress;

bool search_User(User &u)
{ 
   return (u.getName() == searchName && u.getContact() == searchContact && u.getAddress() == searchAddress);

}
void searchUser(vector<User> &u)
{
    cout << "Name of user: ";
    getline(cin, searchName);
    cout << "Contact of tutor: ";
    getline(cin, searchContact);
    cout << "Adress of user: ";
    getline(cin, searchAddress);
    vector<User>::iterator i;
    i = find_if(u.begin(), u.end(), search_User);
    cout << i->getName() << i->getContact() << i->getAddress() << endl;
}
Run Code Online (Sandbox Code Playgroud)

MSa*_*ers 10

通常的解决方案是使用std::copy_if:

std::vector<User> matches;
std::copy_if(v.begin(), v.end(), std::back_inserter(matches),
    [Name, Contact, Address](User const& u)
    { return u.getName() == Name && u.getContact() == Contact && u.getAddress() == Address;});
Run Code Online (Sandbox Code Playgroud)

或者只写一个经典的循环

for (User& u : users) {
  if (search_User(u) {
    std::cout << u; // Assumes you've implemented operator<<(ostream&, User)
  }
} 
Run Code Online (Sandbox Code Playgroud)

  • 有`boost :: filter_iterator`.您描述的`std :: filter`算法为了适应标准库其余部分的设计,必须采用输出迭代器而不是创建并返回自己的集合.这正是`copy_if`的作用. (5认同)
  • 那不是"经典循环"; 这是一个超现代的C++ 11循环. (4认同)
  • @AndyT:它也没有标记c ++ 98,所以我正在使用当前的定义. (2认同)
  • 关于`copy_if()`解决方案的事情是它在内存中保存所有保持为true的谓词.一个有效的解决方案是`filter_iterator`或`for_each_if()`算法. (2认同)

Arm*_*yan 5

伪代码:

for(iterator i = v.begin(); 
    (i = find_if(i, v.end(), ...)) != v.end(); ++i )
{
    print *i;
}
Run Code Online (Sandbox Code Playgroud)