簡體   English   中英

c ++列表迭代器算術替換思想

[英]c++ list iterator arithmetic replacement ideas

我有一個可以在多個地方訪問的列表。 在某些情況下,我需要從列表開始循環到(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不是一個選項,因為我想從列表的開頭得到匹配的第一個實例。

這里有更好的實施方式嗎?

由於它是一個列表,隨機訪問很慢。 幸運的是:

  1. 你總是從頭開始,而且
  2. std::list有一個size()方法

這是一種方式:

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

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

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

}

是的,你可以這樣做

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 )
    {
        //...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM