我想在排序的向量V上对c ++执行二进制搜索。 特别是,我对找到矢量条目的确切值不感兴趣。我想找到满足V [j-1]< = X<的条目的位置j。 V [j],其中X是输入值。
例如: 对于向量v = {1,4,7,12,17,55}和X = 8,函数应返回3.
我可以使用带有O(log(2))复杂度的STD函数binary_search吗?
怎么样?
非常感谢,
的Al。
答案 0 :(得分:8)
标准函数是upper_bound和lower_bound。阅读这些
http://www.cplusplus.com/reference/algorithm/upper_bound/ http://www.cplusplus.com/reference/algorithm/lower_bound/
如果你稍微向下滚动这些页面,你会发现应该清楚说明的例子:)
答案 1 :(得分:4)
关于Bartosz联系的职能的说明:
upper_bound(begin, end, value)
返回大于给定值的第一个元素。这是可插入的区间的 end (或一个接一个),并保留排序lower_bound(begin, end, value)
返回第一个元素不小于给定值。这是可插入区间的开头 所以在实践中:
std::vector<int> v = {1, 4, 7, 12, 17, 55};
int x = 8;
auto first = std::lower_bound(v.begin(), v.end(), x);
auto last = std::upper_bound(first, v.end(), x);
应该给first == last && *first == 12
。这是因为可以插入[first,last)
的半开间隔x
为空。
请注意,这通常比您实际要求的更有用,因为
std::vector::insert(iterator, value)
在给定迭代器之前插入,因此您始终可以在此处使用upper_bound
的结果。
答案 2 :(得分:2)
根据您的要求,要使用的正确STL函数是upper_bound。语法:
upper_bound(V.begin(),V.end(),val)-V.begin()
将返回您寻找的基于0的索引。