c ++ list iterator算术替换思想

时间:2015-10-27 15:56:07

标签: c++ list iterator listiterator

我有一个可以在多个地方访问的列表。在某些情况下,我需要从列表开始循环到(end-n)元素以及访问整个列表的其他元素。我在使用迭代器算法时遇到了麻烦。

我想要的东西可以做到以下几点:

int n =10;
for (list<Term>::iterator itr = final.begin(); itr != (final.end()-n); itr++) {
//
}

以下伪代码是否有意义?

int N = myList.size() - n;
for (list<Term>::iterator itr = final.begin(),int length_reached=0; itr != (final.end() && length_reached<N; itr++,length_reached++) {
//
}

使用rbegin不是一个选项,因为我想要从列表的开头开始匹配的第一个实例。

这里有更好的实施方式吗?

3 个答案:

答案 0 :(得分:3)

由于它是一个列表,随机访问很慢。幸运的是:

  1. 你总是从头开始,
  2. std::list有一个size()方法
  3. 这是一种方式:

    list<Term>::iterator itr = final.begin();
    int to_do = std::max(0, int(final.size()) - n);
    for ( ; to_do ; --to_do, ++itr )
    {
      // code here
    }
    

答案 1 :(得分:0)

你可以使用反向迭代器和std :: advance

auto rit =final.rbegin();
std::advance(rit, n);
for (auto itr=final.begin(); itr!=rti.base(); ++itr) {

}

答案 2 :(得分:0)

是的,你可以这样做

if ( n < final.size() )
{
    auto m = final.size() - n;

    for ( auto first = final.begin(); m != 0; ++first, --m )
    {
        //...
    }
}

如果可以在循环中更改迭代器本身,那么可以按以下方式编写循环条件

if ( n < final.size() )
{
    auto m = final.size() - n;

    for ( auto first = final.begin(); m != 0 && first != final.end(); ++first, --m )
    {
        //...
    }
}