- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 lower_bound 函数,以便返回迭代器而不是 bool 值。
auto testPair = make_pair(0, 0);
auto it3 = std::lower_bound(vec[1].begin(), vec[1].end(), testPair, [](const std::pair<int, double> a, const std::pair<int, double> b)
{
return a.first < b.first;
});
if (it3 != vec[1].end() && !(testPair.first < it3->first))
vec[1].erase(it3);
我基本上采用了原始实现并对其进行了更改,以便它返回一个迭代器,以便我可以使用对。
我的问题在下面一行:
if (it3 != vec[1].end() && !(testPair.first < it3->first))
我的感觉是可以删除第二个逻辑语句,因为使用 lower_bound 意味着 testPair.first 永远不应大于 it3->first。但是,如果我删除 if 语句的那一部分,它在某些情况下将无法正常工作。
谁能告诉我这是为什么以及为什么需要它?
如果我传递一对
auto testPair = make_pair(0, 0);
成对的 vector ,其中包含以下内容
std::push_back(std::make_pair(1,1.6));
std::push_back(std::make_pair(2,1.7));
它会在不应该删除的时候删除第二对。
最佳答案
算法 std::lower_bound
返回迭代器,在该迭代器之前可以将目标值插入到序列中,这样序列仍然是有序的。这并不意味着该算法总是返回指向具有相同目标值的元素的迭代器。
例如,如果你有一个像这样的序列
{ 0, 2, 4, 6 }
并使用值 3 的算法,然后它将返回指向 4 的迭代器。该序列没有值为 3 的元素。因此,您应该检查自己的迭代器是否指向具有相同值的元素。
对于您示例中的 int 类型的对象,您可以简单地编写
if ( it3 != vec[1].end() && testPair.first == it3->first )
^^^
但通常(例如,当使用 float 时)最好使用运算符 <,因为通常使用此运算符对序列进行排序。例如,无需在类中声明运算符 == 即可通过运算符 < 对类的对象序列进行排序,然后使用算法 std::lower_bound 查找目标元素
事实上对于你的代码片段这个声明
if (it3 != vec[1].end() && !(testPair.first < it3->first))
等同于上面的语句。 testPair.first
不能大于 it3->first
。同时如果不小于it3->first
则可以断定它们是相等的。
关于c++ - 具有 lower_bound 函数的二分搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30396363/
我正在尝试编写一个程序,在名为 items 的数组中进行顺序搜索和二分搜索,该数组具有 10000 个已排序的随机 int 值。第二个名为 targets 的数组加载了 1000 个 int 值(50
当我尝试使用图表并为其编写一些代码但没有成功时,我遇到了一个问题:/!! 我想创建一些东西来获取图形数据并检查它是否:1- 连接2-二分法3-有循环4-是一棵树 所以我想知道,例如,是否可以将其写入以
我是一名优秀的程序员,十分优秀!