有没有一种干净的方法可以检查我目前是否处于C ++迭代中的倒数第二个元素?如:
for (vector::iterator it = v.begin(); it < v.end(); ++it)
{
if (it points to second to last element)
cout << "at second to last";
}
答案 0 :(得分:6)
最简单的方法是将迭代器与确实指向倒数第二个的迭代器进行比较。一个简单的方法是:
vector::iterator secondLast = v.end() - 2;
当然假设v.size() >= 2
。但上述内容并未概括为其他容器类型,您可以这样做:
vector::iterator secondLast = (++v.rbegin()).base();
这应该从最后一个元素回退一步,然后转换为常规(前向)迭代器。这将适用于其他容器类型,如列表。
或者对于一般解决方案可能更清楚:
vector::iterator secondLast = v.end();
std::advance(secondLast, -2);
同样,这需要2的大小和随机访问或双向类型的迭代器。
最后,一个C ++ 11解决方案:
auto secondLast = std::prev(v.end(), 2);
答案 1 :(得分:1)
以下解决方案:
auto pos = std::next(std::begin(v), std::distance(std::begin(v), std::end(v))-2);
for (auto it = std::begin(v); it != std::end(v); ++it)
{
if (it == pos)
cout << "at second to last: " << *pos;
}
pos
现在是指向倒数第二个位置的迭代器,函数std::next
和std::distance
使用最佳实现(即随机迭代器的常量复杂度,线性复杂度为双向/前向迭代器)。
答案 2 :(得分:1)
尝试这样的事情:
vector::iterator end = v.end(), stl;
bool has_stl = (v.size() >= 2);
if (has_stl) stl = end-2;
for (vector::iterator it = v.begin(); it < end; ++it)
{
if ((has_stl) && (it == stl))
cout << "at second to last";
}
答案 3 :(得分:1)
您可以使用某些容器执行此操作:
#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;
}