我需要二进制搜索功能。
我无法在标准库中找到任何会返回找到的项目索引的函数,如果找不到,将返回该按位补码下一个元素的索引大于我查找的项目。
我在寻找什么功能?
编辑: 我需要将一个项插入到已排序的向量中并对其进行排序。这就是我需要按位补充索引的原因。
答案 0 :(得分:4)
我非常肯定标准库并没有包含任何可以准确你要求的东西。
为了得到你想要的东西,你可能想要从std::lower_bound
或std::upper_bound
开始,并将它返回的迭代器转换为索引,然后补充值的索引isn&# 39; t found。
答案 1 :(得分:1)
显然,这个“将返回按位补充”对你来说是一个大问题,我不明白你的意思。也就是说,查找std::upper_bound并查看它是否符合您的要求。
答案 2 :(得分:0)
据我所知,没有简单的STL方法可以对已排序的向量返回索引,但是您可以使用下面的示例函数:
/**
* @param v - sorted vector instance
* @param data - value to search
* @return 0-based index if data found, -1 otherwise
*/
int binary_search_find_index(std::vector<int> v, int data) {
auto it = std::lower_bound(v.begin(), v.end(), data);
if (it == v.end() || *it != data) {
return -1;
} else {
std::size_t index = std::distance(v.begin(), it);
return index;
}
}
答案 3 :(得分:0)
使用STL,我们可以找到索引
vector<int> vec{1,2,3,4,5,6,7,8,9} ;
vector<int> :: iterator index;
index=lower_bound(vec.begin(),vec.end(),search_data);
return (index-vec.begin());
答案 4 :(得分:0)
int bin_search (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator low;
low = std::lower_bound(first,last,val);
if(low!=last && !(val<*low)){
return (low - first + 1);
}else{
return 0;
}
}
答案 5 :(得分:0)
int a = 0, b = n-1;
while (a <= b) {
int k = (a+b)/2;
if (array[k] == x)
{
// x found at index k
}
if (array[k] < x) a = k+1;
else b = k-1;
}
答案 6 :(得分:0)
使用 Jonathan 的回答,一个单行函数,for the case where we want to know at which index the value is or should have been if it does not exist:
int searchInsert(vector<int>& nums, int target) {
return lower_bound(nums.begin(), nums.end(), target) - nums.begin();
}
答案 7 :(得分:0)
这段代码应该可以正常工作
auto itr = lower_bound(v.begin(), v.end(), key) ;
index = distance(v.begin(), itr);
更多关于 std::lower_bound() - https://www.geeksforgeeks.org/stdlower_bound-in-c/
答案 8 :(得分:0)
我正在解决一个类似的问题,我需要在向量中插入一个元素,同时保持它的排序。我想出的解决方案是:
函数(修改后的二分查找)返回值应该插入的位置。
int Position(vector<int> arr, size_t size, int val)//void for commented part
{
int start=0, middle, end=size-1;
while(arr[start] <= arr[end])
{
middle = (int)((start+end+1)/2);
if (arr[middle] < val)
{
start = middle+1;
}
else if (arr[middle] > val)
{
end = middle-1;
}
else//arr[middle]=val;
{
return middle;
}
}
mid = (int)((start+end+1)/2);
//arr.insert(arr.begin()+mid, val); Can I do it here? got error trying to do it.
return mid;
}
int main()
{
vector<int> x; cin>> val;
mid = Position(x, x.size(), val);
x.insert(x.begin()+mid, val);
}