繁体   English   中英

即使元素不存在,c ++ stl中的lower_bound也会返回一个迭代器。 怎么避免这个?

[英]lower_bound in c++ stl returns an iterator even when the element is not present. How to avoid this?

int arr[]={1,2,3,5,6,7};

使用lower_bound(arr,arr+6,4)将迭代器返回到5 如何确保它仅在元素存在时返回索引?

std::lower_bound就是你想要的,你只需要为你的支票添加一个条件。 要查看4是否在您将使用的数组中

int arr[] = {1,2,3,5,6,7}; 
auto it = std::lower_bound(std::begin(arr), std::end(arr), 4)
if (it != std::end(arr) && *it == 4) // && short circuts so *it == 4 wont be done unless it is valid
    std::cout << "4 found";
else
    std::cout << "4 not found";

std :: lower_bound 总是返回一个迭代器 - 没办法。

具体来说,它返回“Iterator指向不小于值的第一个元素,如果没有找到这样的元素则返回最后一个”。 (并且测试“最后”以确定“未找到”很容易)。

这就是算法的定义。 如果这符合您的需求,请使用它。 如果没有,请不要使用它。

当找不到元素value时, std::lower_bound( begin, end, value )不返回end原因是因为它使它更通用。 例如,如果要在已排序的容器中查找包含3,4或5的序列,可以写为:

auto b = std::lower_bound( begin, end, 3 );
auto e = std::upper_bound( b, end, 5 );

在此范围之后[b,e)将具有元素3,4,5s(如果有)或空范围,在这种情况下b == e 在这种情况下,如果容器中没有值为3的元素(但是4或5)并且它可以工作,那么您将无法找到它们。 另一方面,为你的情况调整lower_bound() (添加额外的检查或使用std::equal_range()并比较两个迭代器)是微不足道的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM