检查迭代器中是否为倒数第二 是否有一个干净的方法来检查我当前是否处于C++中的迭代中的第二个元素?例如: for (vector::iterator it = v.begin(); it < v.end(); ++it) { if (it points to second to last element) cout << "at second to last"; } for(vector::iterator it=v.begin();it=2); 如果(has_stl)stl=end-2; for(vector::iterator it=v.begin();it=2。但上述情况并不适用于其他容器类型,您可以这样做: vector::iterator secondLast = (++v.rbegin()).base();

检查迭代器中是否为倒数第二 是否有一个干净的方法来检查我当前是否处于C++中的迭代中的第二个元素?例如: for (vector::iterator it = v.begin(); it < v.end(); ++it) { if (it points to second to last element) cout << "at second to last"; } for(vector::iterator it=v.begin();it=2); 如果(has_stl)stl=end-2; for(vector::iterator it=v.begin();it=2。但上述情况并不适用于其他容器类型,您可以这样做: vector::iterator secondLast = (++v.rbegin()).base();,c++,stl,iterator,C++,Stl,Iterator,您可以使用一些容器执行此操作: #include <iostream> #include <vector> int main() { std::vector<int> vec {1, 2, 3, 4, 5}; for (auto it = vec.begin(); it != vec.end(); it++) { if (vec.end() - it == 3) { std::cout <<

您可以使用一些容器执行此操作:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec {1, 2, 3, 4, 5}; 
    for (auto it = vec.begin(); it != vec.end(); it++) {
        if (vec.end() - it == 3) {
            std::cout << *it << std::endl;
        }
    }   
    return 0;
}
#包括
#包括
int main(){
向量向量{1,2,3,4,5};
for(auto it=vec.begin();it!=vec.end();it++){
if(vec.end()-it==3){

std::cout最简单的方法是将您的迭代器与确实指向倒数第二个的迭代器进行比较。一种简单的方法是:

vector::iterator secondLast = v.end() - 2;
当然,假设
v.size()>=2
。但上述情况并不适用于其他容器类型,您可以这样做:

vector::iterator secondLast = (++v.rbegin()).base();
这应该从最后一个元素后退一步,然后转换为常规(正向)迭代器。这将适用于其他容器类型,如列表

或者对于一般解决方案来说更清楚:

vector::iterator secondLast = v.end();
std::advance(secondLast, -2);
auto secondLast = std::prev(v.end(), 2);
同样,这需要2的大小和随机访问或双向类型的迭代器

最后是一个C++11解决方案:

vector::iterator secondLast = v.end();
std::advance(secondLast, -2);
auto secondLast = std::prev(v.end(), 2);

end()
在最后一个元素之后返回一个迭代器,因此
end-1
将是最后一个元素,
end-2
将是发送到最后一个元素。@RemyLebeau,绝对正确,我修改了它,感谢您捕获它。这不是前向迭代器或双向迭代器的最有效解决方案。想象一下将它与列表一起使用:首先,您在开始实际工作之前,在整个列表中迭代
距离
,然后再次迭代
下一步
。双向迭代器的最佳值是O(1)而不是O(n),正向迭代器的最佳值是单遍(具有恒定空间),不是两次通过。@JohnZwinck,嗯,你是对的,忘记了距离的复杂性。我想以前的解决方案(我设法删除了)更好。
O(1)
是针对随机迭代器的(不是双向的),这就是你的意思,对吗?@vsoftco:no,O(1)对于双向迭代器,因为您从末尾开始,向后返回两个,如我的答案所示(它不支持只向前的迭代器——当然它们仍然是O(n)。
std::prev(v.end(),2)
也可以使用。@0x499602D2,不适用于
forward\u迭代器
s,仅适用于双向,同样适用于
std::advance
@vsoftco:我发布的任何解决方案也不适用于纯forward迭代器。@JohnZwinck抱歉,我刚刚看到了你的最后一行。我想没有比
O(n)更好的了
对于最通用的迭代器,但对于双向迭代器,您的解决方案绝对是优雅的。@JohnZwinck,
std::advance
引用迭代器,然后将其前进,并返回
void
。您可能指的是
std::prev(v.end(),-2)
std::advance(secondLast,-2)
,其中,
secondLast
先前已初始化为
v.end()
检查迭代器的位置对于双向迭代器和前向迭代器更有意义。对于随机访问迭代器,您不妨使用索引。