Return vector::end()
, ném một ngoại lệ, hoặc trả lại một cái gì đó khác hơn là một iterator đồng bằng
Hơn thế nữa, không thực hiện Find
chức năng của riêng bạn. Đó là thư viện <algorithm>
dành cho. Dựa trên mã psudocode của bạn, bạn có thể sử dụng std::find
hoặc std::find_if
. find_if
đặc biệt hữu ích trong trường hợp bình đẳng không nhất thiết có nghĩa là operator==
. Trong những trường hợp đó, bạn có thể sử dụng lambda [C++ 11] hoặc nếu C++ 11 không có sẵn cho bạn, một lớp functor.
Kể từ khi functor là mẫu số chung thấp nhất, tôi sẽ bắt đầu với điều đó:
#include <cstdlib>
#include <string>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
class Person
{
public:
Person(const string& name, unsigned age) : name_(name), age_(age) {};
string name_;
unsigned age_;
};
class match_name : public unary_function <bool, string>
{
public:
match_name(const string& rhs) : name_(rhs) {};
bool operator()(const Person& rhs) const
{
return rhs.name_ == name_;
}
private:
string name_;
};
#include <iostream>
int main()
{
vector<Person> people;
people.push_back(Person("Hellen Keller", 99));
people.push_back(Person("John Doe", 42));
/** C++03 **/
vector<Person>::const_iterator found_person = std::find_if(people.begin(), people.end(), match_name("John Doe"));
if(found_person == people.end())
cout << "Not FOund";
else
cout << found_person->name_ << " is " << found_person->age_;
}
found_person
nay chỉ vào người có tên là "John Doe", nếu không chỉ ra people_.end()
nếu người đó wasn Không tìm thấy.
Một lambda C++ 11 là cú pháp ngôn ngữ mới làm cho quá trình khai báo/định nghĩa một hàm và sử dụng đơn giản hơn trong nhiều trường hợp. Nó được thực hiện như thế này:
string target = "John Doe";
vector<Person>::const_iterator found_person = std::find_if(people.begin(), people.end(), [&target](const Person& test) { return it->name_ == target; });
Nguồn
2012-05-09 19:33:39
Nếu bạn không có lý do cụ thể để sử dụng của riêng bạn, hãy xem xét 'std :: find'. Cách nó được thực hiện mặc dù, là nó sẽ trả về 'end()'. – chris
Điều này có vẻ giống như một lỗ hổng thiết kế. Trả về một bản sao, một con trỏ, một bool cho biết trạng thái tìm thấy và sửa đổi một cá thể đầu vào thông qua tham chiếu, nhưng KHÔNG trả về một trình lặp cho một container ẩn! –
tìm thấy độ phức tạp là O (n). tôi đang thực sự sử dụng một tìm kiếm nhị phân kết thúc trở lại để thực hiện tìm kiếm. Điều này quan trọng khi im triển khai một hệ thống phân tán rất lớn. – mister