我有一个节点结构
struct Node{CString text, int id;};
在一个有序矢量中。
我想知道算法中是否有一个函数可以对向量进行二元搜索并找到一个元素。
答案 0 :(得分:21)
std::binary_search()
会告诉您容器中是否存在值。
std::lower_bound()/std::upper_bound()
将返回一个迭代器到第一个/最后一个值。
您的对象需要实现operator<
才能使这些算法正常工作。
答案 1 :(得分:6)
是的,有一个名为“binary_search”的函数std :: binary_search
你先给它,最后给它一个值或一个谓词。
请参阅here了解示例
将它与Martin York's运算符==结合起来你应该没问题(或者你可以写一个谓词仿函数
答案 2 :(得分:0)
而不是排序的向量&lt;节点&gt;
为什么不使用地图。这是一个已排序的容器。因此,通过std :: find()对此进行的任何搜索都会自动具有与二进制搜索相同的属性。
答案 3 :(得分:0)
使用std::equal_range
查找已排序向量中的一系列元素。 std::equal_range
返回std::pair
个迭代器,为您提供与您提供的参数相等的元素向量范围。如果范围为空,则您的项目不在向量中,并且范围的长度会告诉您项目在向量中出现的次数。
以下是使用整数而不是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;
}
要使用struct Node
工作,您必须为operator <
提供struct Node
或将比较器传递给std::equal_range
。你可以通过提供一个lambda作为std::equal_range
的参数来比较你的结构。
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; });