0

次の質問セグメンテーション違反の実行方法別の問題で停止しました。

与えられた:

Cluster * base;
Cluster * absorbed;

list<Cluster>::iterator li = clusters.begin();

// li is then pointed to some element.

absorbed = &(*li);   // Get a pointer to the chosen element.

base->joinCluster(absorbed);   // Perform an action with absorbed.

// li contines the cycle and now point to clusters.end()

// Now, absorbed should be deleted from list. li doesn't point to absorbed anymore.
li = & (* absorbed);
clusters.erase(li);

上記の逆を実行しようとしましたが、g++ はエラーを返します:error: no match for 'operator=' in 'li = absorbed' どうすればこれを行うことができますか?

リスト内のすべての要素を循環して再度見つけることを避けようとしていますabsorbed

編集:

absorbed = &(* li); li申し訳ありませんが、 afterが まで循環し続けることを言い忘れていたことを理解していますclusters.end()。そのため、サイクルが終了した時点で、もうli指していabsorbedません。2 つの選択肢があると思います。要素clustersを見つけるためにすべての要素をもう一度循環しabsorbedます。または、absorbedポインタを利用して から要素を消去しますclusters。しかし、どうすればこの 2 番目のオプションを実現できますか?

4

4 に答える 4

4

行をスキップするだけで、li = &(*absorbed)正常に動作するはずです。

于 2012-04-18T12:10:31.303 に答える
3

std::list<T>::iteratorから を取得することはできませんT*liイテレータ操作を実行するには、オリジナルを使用する必要があります。

于 2012-04-18T12:11:33.923 に答える
3

消すだけ!
とにかく削除する場合は、値を元に戻そうとする必要はありません。

于 2012-04-18T12:11:41.440 に答える
0

それ以外の

// Now, absorbed should be deleted from list
li = & (* absorbed);
clusters.erase(li);

使用する:

clusters.pop_front();

常に最初の要素を処理する場合。

値から反復子を取得する方法はありません。理由はありませんが、同じ値が複数のコンテナーに存在することも、複数のコンテナーに存在することもあります。

于 2012-04-18T12:25:40.387 に答える