2

STL イテレータを再利用しようとしましたが、これに関する情報が見つかりません。このコードに問題があります:

    std::vector< boost::shared_ptr<Connection> >::iterator poolbegin = pool.begin();
std::vector< boost::shared_ptr<Connection> >::iterator poolend = pool.end();
if( order ) {
    poolbegin = pool.rbegin(); // Here compilation fails
    poolend   = pool.rend();
}
    for( std::vector< boost::shared_ptr<Connection> >::iterator it = poolbegin; it<poolend; it++) {

しかし、エラーが発生します:

エラー: 'poolbegin = std::vector<_Tp, _Alloc>::rbegin() with _Tp = boost::shared_ptr, _Alloc = std::allocator >' の 'operator=' に一致しません</p>

イテレータを新しい値にリセットする方法はありますか? shared_ptr::reset のように?

4

2 に答える 2

7

rbegin()を返しますreverse_iterator。これは、通常のとはまったく異なるタイプiteratorです。

それらを相互に割り当てることはできません。

于 2012-09-26T15:23:19.563 に答える
1

条件に応じて、ベクトルを前後に移動するループが必要なようです。

これを行う 1 つの方法は、ループ本体をファンクター (C++11 の場合はラムダ) に分解することです。

struct LoopBody {
  void operator()(boost::shared_ptr<Connection> connection) {
    // do something with the connection
  }
  // If the loop body needs to be stateful, you can add a constructor
  // that sets the initial state in member variables.
};

これで、ループを通過する方法について 2 つの選択肢を得ることができます。

LoopBody loop_body;
if (reverse_order) {
  std::for_each(pool.rbegin(), pool.rend(), loop_body);
} else {
  std::for_each(pool.begin(), pool.end(), loop_body);
}
于 2012-09-26T16:16:19.327 に答える