【发布时间】:2017-04-29 18:55:27
【问题描述】:
我有这个:
vector<int> vec = {10, 4, 18, 7, 2, 10, 25, 30};
auto& pos25 = find(vec.cbegin(), vec.cend(), 25);
auto& pos18 = find(vec.cbegin(), vec.cend(), 18);
现在,我想查询两个位置之间的 7。我可以在pos25 和pos18 之间使用operator<,因为它们是随机访问迭代器,然后我可以find 在该范围内找到7 的位置。
但是如果我的容器是forward_list。我将如何实现它,因为我没有 operator< 来比较这两个迭代器;因此我不知道是 pos25 还是 pos18 首先出现给 find 函数一个范围。
我在一本书中找到了这个方法:
pos18 = find (vec.begin(), vec.end(), // range
18); // value
pos25 = find (vec.begin(), pos18, // range
25); // value
if (pos18 != coll.end() && pos25 != pos18) {
// pos25 is in front of pos18
// so, only [pos25,pos18) is valid
...
}
else {
pos25 = find (pos25, vec.end(), // range
25); // value
if (pos25 != coll.end()) {
// pos18 is in front of pos25
// so, only [pos18,pos25) is valid
...
}
else {
// 18 and/or 25 not found
...
}
}
虽然这很简单,但还有什么更高效的吗?
【问题讨论】:
-
这很繁琐,但你不会为了效率而打败它——它通过搜索整个向量找到
pos18,然后通过首先从begin到@搜索找到pos25987654336@,然后从pos18到end- 所以它是最优的。我认为你不能做得更好。 -
@MartinBonner 这会不止一次地查看元素,因此您可以绝对击败它以提高效率,请参阅my answer。
-
@JonathanMee:啊哈!我是根据“比较次数”而不是“迭代次数”来考虑效率的——我通常认为它“便宜”——但你是对的。在链表的情况下,这是一种糟糕的直觉。
标签: c++ c++11 stl iterator find