STL容器向前和向后行走

STL container to walk forwards and backwards

本文关键字:STL      更新时间:2023-10-16

作为一个基本问题,我正在寻找一个适合以下类型使用的STL容器:

1) 支持定期前向迭代

2) 支持从列表中间删除,同时向后浏览列表,以及

3) 如果某个东西在向后走的时候被删除了,我需要停下来向前走到列表的末尾。

我使用了一个常规的std::list,发现从列表中的某个点向前走有点困难,但可行。我使用了正向和反向的组合,并设法避免使用advance(因为这会很昂贵!)

这是我的密码。

#include <list>
using namespace std ;
int main()
{
  list< int > os ;
  os.push_back( 1 ) ;
  os.push_back( 2 ) ;
  os.push_back( 3 ) ;
  os.push_back( 4 ) ;
  os.push_back( 5 ) ;  
  // 1 2 3 4 5
  // should print:
  // 5: NOTHING
  // 4: 5
  // 3: 4,5
  // 2: 3,4,5
  // 1: 2,3,4,5
  for( list<int>::reverse_iterator riter = os.rbegin() ; riter != os.rend() ; ++riter )
  {
    //printf( "All the ones in FRONT of %d are:n", riter->a ) ;
    printf( "%d:  ", *riter ) ;
    // You can't do it with a for loop.
    //for( list<O>::reverse_iterator iter = riter ; iter != os.rbegin() ; --iter )
    list<int>::reverse_iterator iter = riter ;
    if( iter != os.rbegin() ) do
    {
      --iter ; // move the iterator back.
      printf( " %d", *iter ) ;
    } while ( iter != os.rbegin() ) ;
    //else printf( " NOTHING AFTER ME" ) ;
    puts("");
  }
}

我的问题是:

  • 我是不是选错了集装箱?我应该使用deque
  • 有没有办法在内部循环中使用for而不是do/while

考虑到您的要求,我认为您选择list是好的(但它是std::list,而不是stl::list)。

vector的中间移除会使移除的元素之前的所有指针、引用和迭代器失效;从deque的中间移除将使所有指针、引用和迭代器无效。

另一方面,从list中删除保证只会使所删除元素的迭代器无效,因此,如果在删除元素时注意得当,则可以继续向前和向后迭代。

考虑到你的循环,我忍不住指出:

if (C) do { ... } while (C)

相当于更优雅(IMO):

while (C) do { ... }
相关文章:
  • 没有找到相关文章