现在我们有了 advance()
和 prev()
方法可以将迭代器前进或后退,同时我们已经有了 begin()
和 end()
方法。
我想知道是否存在一些情况下需要前进或后退反向迭代器?
现在我们有了 advance()
和 prev()
方法可以将迭代器前进或后退,同时我们已经有了 begin()
和 end()
方法。
我想知道是否存在一些情况下需要前进或后退反向迭代器?
算法通常需要两个迭代器来指定一段元素的范围。例如 std::for_each
:
std::vector<int> x;
std::for_each(x.begin(),x.end(),foo);
for_each
在反向迭代中运行(注意:for_each
会按顺序迭代),那么既不需要使用advance
也不需要使用prev
,但可以使用反向迭代器:std::for_each(x.rbegin(),x.rend(),foo);
因为使用 begin()
和 end()
进行反向迭代看起来很糟糕:
std::vector<int> v {1, 2, 3};
if(!v.empty()) { //need to make sure of that before we decrement
for(auto it = std::prev(v.end()); ; --it) {
//do something with it
if(it == v.begin()) {
break;
}
}
}
与反向迭代器版本进行比较:
std::vector<int> v {1, 2, 3};
for(auto it = v.rbegin(); it != v.rend(); it++) {
//do something with it
}
continue
(而不重新检查 it
与 v.begin()
的关系)。 - Jarod42std::for_each()
,std::accumulate()
,std::find_if()
这样的算法时,它们会按照++
的方式进行系统化进展。for (itr1 = vec.rbegin(); itr1 < vec.rend(); itr1++) {
if (*itr1 == num) {
vec.erase((itr1 + 1).base());
}
}
begin()
和 rend()
不同,end()
也不等同于 rbegin()
,因此需要使用 rbegin()/rend()
。请参考这张来自cppreference的图片。
这样,您可以从头到尾使用任何算法,也可以从最后一个元素向后使用任何算法。
rbegin/rend
就没有必要了。 - Olaf Dietschestd::string s = "Hello";
std::string r(s.rbegin(), s.rend());
std::cout << r;
有使用 for each 的示例。然而,更一般地,它允许您重用任何与迭代器前进一起工作的算法或运算符,以相反的顺序执行相同的操作。