Sử dụng std::equal_range
để tìm một loạt các phần tử trong một véc tơ được sắp xếp. std::equal_range
trả về số std::pair
của vòng lặp, cho bạn phạm vi trong vectơ của các phần tử bằng đối số bạn cung cấp. Nếu phạm vi trống, thì mục của bạn không có trong vectơ và độ dài của phạm vi cho bạn biết số lần mục của bạn xuất hiện trong vectơ.
Dưới đây là một ví dụ sử dụng ints thay vì struct Node
:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
int main(int argc, const char * argv[])
{
std::vector<int> sorted = { 1, 2, 2, 5, 10 };
auto range = std::equal_range(sorted.begin(), sorted.end(), 20);
// Outputs "5 5"
std::cout << std::distance(sorted.begin(), range.first) << ' '
<< std::distance(sorted.begin(), range.second) << '\n';
range = std::equal_range(sorted.begin(), sorted.end(), 5);
// Outputs "3 4"
std::cout << std::distance(sorted.begin(), range.first) << ' '
<< std::distance(sorted.begin(), range.second) << '\n';
range = std::equal_range(sorted.begin(), sorted.end(), -1);
// Outputs "0 0"
std::cout << std::distance(sorted.begin(), range.first) << ' '
<< std::distance(sorted.begin(), range.second) << '\n';
return 0;
}
Để làm công việc này với struct Node
bạn hoặc sẽ phải cung cấp một operator <
cho struct Node
hoặc vượt qua trong một so sánh để std::equal_range
. Bạn có thể làm điều đó bằng cách cung cấp lambda làm đối số cho std::equal_range
để so sánh cấu trúc của bạn.
std::vector<Node> nodes = { Node{"hello", 5}, Node{"goodbye", 6} };
Node searchForMe { "goodbye", 6 };
auto range = std::equal_range(nodes.begin(), nodes.end(), searchForMe,
[](Node lhs, Node rhs) { return lhs.id < rhs.id; });
Bạn có chắc chắn về dấu phẩy giữa CString không? Đó không phải là dấu chấm phẩy sao? – razeh