0

少し初歩的な質問ですが、次のような用途に適した 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
4

1 に答える 1

1

あなたの要件を考えると、あなたの選択listは良いと思います (しかし、それはではstd::listありませんstl::list)。

a の途中から削除vectorすると、削除された要素の前の要素へのすべてのポインター、参照、および反復子が無効になります。a の途中から削除するdequeと、すべてのポインター、参照、および反復子が無効になります。

一方、 a からの削除はlist、削除する要素への反復子のみを無効にすることが保証されているため、要素を削除するときに適切な注意を払えば、前後に反復し続けることができます。

あなたのループを考えると、私はそれを指摘せずにはいられません:

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

よりエレガント(IMO)と同等です:

while (C) do { ... }
于 2013-02-07T00:01:12.267 に答える