0

コード:

std::vector<std::string>::iterator first = iter;

if( ++iter != iter_is_pointing_to_this_vector.end())
{
  ...

イテレータを「最初に」逆参照すると、セグメンテーション違反が発生します。逆参照をコメント アウトすると、プログラムは単に if ステートメントで停止し、続行しません。iter のインクリメントは、明らかに私が期待することをしません: 問題のベクトルが、「iter」が指している項目を渡すメンバーを持っているか、持っていないことを確認したいのです。

この動作の原因は何ですか?

4

1 に答える 1

0

コメントが長すぎたので、回答として投稿しますが、完全ではない可能性があります。

++iterイテレータを進めるなどの構成。したがって、ループ内にラインがあり、ループ++iterの最後に別のラインがある場合は、ループごとに2回進めます。++iter次の要素を指すイテレータを生成せず、むしろその要素に移動iterします。

私が理解していることから、あなたは++iter != iter_is_pointing_to_this_vector.end()次の要素が終わりであるかどうかをチェックするためにあなたがすることを理解しています。現在の要素がベクトルの最後の要素であるかどうかを判別します。しかし、あなたが書いたコードは何か違うことをします。

必要なことを実行するには、現在の要素から次の要素に設定する別のイテレーターが必要になります。

std::vector<std::string>::iterator = iter = v.begin();
std::vector<std::string>::iterator = iter2 = v.begin();
++iter2;
while( {...} ){
  if(iter2 != v.end() ){...}
  ++iter2; ++iter;
}

もちろんv、複数の要素があることを確認する必要があります。reverse_iteratorコンテナがそれを提供する場合にも使用できます。

typedef iter_t std::vector<std::string>::iterator;
iter_t = iter = v.begin();
std::reverse_iterator<iter_t> = iter2 = v.rbegin();
while( {...} ){
  if(iter != iter2.base() ){...}
  ++iter;
}

注:base()逆反復子を通常の(順方向)反復子に変換して、比較できるようにします。

編集:双方向イテレータで使用できるようです。つまりreverse_iterator、デクリメント操作も実装されているはずです。したがって、実際には逆方向に反復する必要はないので、に対して1つの要素に対して反復子が必要なだけendで、より簡単な方法は次のようになります。

typedef iter_t std::vector<std::string>::iterator;
iter_t = iter = v.begin();
iter_t = iter2 = v.end();
--iter2;
while( {...} ){
  if(iter != iter2){...}
  ++iter;
}
于 2012-12-17T11:18:13.190 に答える