Для C ++ 14 мое предпочтительное решение - использовать std::copy_if
и возвращать вектор всех совпадений и передавать параметры, необходимые для поддержания разделения:
std::vector<User> findMatches( const std::vector<User> &v) {
std::vector<User> matches;
std::copy_if(v.begin(), v.end(), std::back_inserter(matches),
[Name, Contact, Address](User& u)
{
return(u.getName() == Name
&& u.getContact() == Contact
&& u.getAddress() == Address);
});
return matches;
}
В настоящее время самое популярное решение @MSalters содержит ошибку в лямбде, в которой отсутствует оператор возврата.
https://godbolt.org/g/CQOXzv
http://cpp.sh/2j7q7
$ g++-5 -std=c++14 user.cpp -o test.bin
$ ./test.bin
Чтобы скомпилировать в командной строке, сохраните следующее как user.cpp и запустите:
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
class User {
public:
std::string Name;
std::string Contact;
std::string Address;
auto getName() {
return Name;
}
auto getContact() {
return Contact;
}
auto getAddress() {
return Address;
}
User() = default;
};
std::ostream & operator<<(std::ostream &stream, const User &u)
{
stream << u.Name << " " << u.Contact << " " << u.Address;
return stream;
}
std::vector<User> findmatches( std::vector<User> &v,
std::string Name,
std::string Contact,
std::string Address) {
std::vector<User> matches;
std::copy_if(v.begin(), v.end(), std::back_inserter(matches),
[Name, Contact, Address](User& u)
{
return(u.getName() == Name
&& u.getContact() == Contact
&& u.getAddress() == Address);
});
return matches;
}
int main () {
std::vector<User> v {};
v.push_back({"Tom Cruise","917-032-2342","200 Top Gun Lane, Miramar, CA 93212"});
v.push_back({"Chuck Norris","911-032-1111","300 Santa Monica Blvd, Hollywood, CA 93212"});
v.push_back({"Santa Clause","315-4323-3111","1 North Pole Circle, North Pole, Elf Division, Antarctica 00000"});
auto matches = findmatches(v, "Chuck Norris", "911-032-1111", "300 Santa Monica Blvd, Hollywood, CA 93212");
for ( auto i : matches ) {
std::cout << i << std::endl;
}
}