【发布时间】:2019-11-13 12:45:28
【问题描述】:
假设我有一个东西的向量:
std::vector<Foo> v;
此向量已排序,因此相等的元素彼此相邻。
获取表示具有相等元素的范围的所有迭代器对的最佳方法是什么(使用标准库)?
while (v-is-not-processed) {
iterator b = <begin-of-next-range-of-equal-elements>;
iterator e = <end-of-next-range-of-equal-elements>;
for (iterator i=b; i!=e; ++i) {
// Do something with i
}
}
我想知道如何在上面的代码中获取b 和e 的值。
例如,如果v 包含这些数字:
index 0 1 2 3 4 5 6 7 8 9
value 2 2 2 4 6 6 7 7 7 8
然后我想让b 和e 指向循环中的元素:
iteration b e
1st 0 3
2nd 3 4
3rd 4 6
4th 6 9
5th 9 10
有没有一种优雅的方法可以用标准库解决这个问题?
【问题讨论】:
-
应该注意,问题中的代码并不是一个很好的例子来说明它是如何有用的。除了限制内部循环之外,
e没有做任何事情,并且内部循环也可以通过测试元素i中的新值来限制。因此,寻找e所花费的任何努力都是徒劳的(除非计算用于对v进行排序的“值”非常昂贵,以至于对e进行二分搜索比在我们进行时测试每个元素要便宜)。 -
@EricPostpischil:确实如此。但是即使我们什么都不用
e,这个公式很方便,更难出错。另一种方法(检查值的变化)更繁琐(因为我们需要特别处理最后一个范围 - 或者你知道一些技巧来避免它吗?)。 -
@geza 最后一个范围不需要特殊处理。
标签: c++ algorithm c++17 c++-standard-library iterator-range