检查迭代器中的倒数第二位

时间:2014-07-19 02:55:58

标签: c++ stl iterator

有没有一种干净的方法可以检查我目前是否处于C ++迭代中的倒数第二个元素?如:

for (vector::iterator it = v.begin(); it < v.end(); ++it)
{
   if (it points to second to last element)
      cout << "at second to last";
}

4 个答案:

答案 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::nextstd::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;
}