STL容器向前和向后行走

时间:2013-02-06 23:53:10

标签: c++ list stl iteration reverse

一些基本问题,我正在寻找适合以下类型用途的STL容器:

1)支持定期前向迭代

2)支持从列表中间删除,同时向后遍历列表,

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

我使用了常规的std::list,发现从列表中的某个点向前走,有点困难,但可行。我使用了forward和reverse_iterator的组合,并设法避免使用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

1 个答案:

答案 0 :(得分:1)

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

vector的中间删除会使所有指针,引用和迭代器无效,这些元素在删除的元素之前;从deque的中间删除会使所有指针,引用和迭代器无效。

另一方面,从list移除保证仅使您移除的元素的迭代器无效,因此如果在移除元素时采取适当的谨慎,则可以继续向前和向后迭代。

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

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

相当于更优雅(IMO):

while (C) do { ... }