私はコンテナへのデリゲートであり、このコンテナへのイテレータを内部的に格納するクラスを持っています。元のコンテナからそのコピーへのイテレータのミラーリング
class A {
public:
list<int> m_data;
list<int>::iterator m_relevantDataStart;
A(const A & cpy) {
m_data = cpy.m_data;
m_relevantDataStart = cpy.m_relevantDataStart; //<--- UNWISE
}
};
今の問題は、私は上記の描かれているように、コンテナとイテレータの両方をコピーするための簡単なコンストラクタを記述しようとした場合、反復子はコピーのコンテキストで使用できなくなることがあり、より具体的に、私は後で実行時例外が発生しました比較を実行しようとしたとき:
`if(m_relevantDataStart == m_data.begin())` - Expression: list iterators incompatible
これを私は推測m_relevantDataStart
はまだ私は元の容器のコピーにm_data.begin()
ポイントのに対し、からコピーされたクラスのm_data
のイテレータであるために生じます。
私はthis answerを見つけました。これは、元のコンテナを指しているiterator
が実際には使用できなくなることを意味します。
私の質問とTL; DR:この「ミラーリング」の結果がコピーコンテナの対応する要素を指し示すようにイテレータを元のコンテナにミラーリングする方法はありますか?
私は元の容器(std::list
を扱う線形複雑度)内の項目のインデックスを決定し、コピーコンテナにイテレータを進める必要となる一つの解決策を考えることもできますが、私の代わりにstd::list
それのいくつかのランダム・アクセス・コンテナを使用しない限り、非常に非効率的であるように思われる。
カスタムコンテナのコピーアルゴリズムを書くオプションもありますが、これは避けたいものです。
ありがとうございます。 'list'は私のケースでは最も適切なコンテナです。両端の挿入と削除が頻繁に行われるためです。 "距離"と "進歩"の解決策は、私が一緒に行く予定でした。おそらく私のために汚れた仕事をしてくれる 'list'の関数のいくつかの隠れたオーバーロードがあるのかもしれないと思っていましたが、本当に洗練された解決法はないと私は確信していました。 – user35443
@ user35443:両端に(中央ではなく)両端を挿入/削除する必要がある場合は、 'std :: list'ではなく' std :: deque'が必要です。 *と*ランダムアクセスイテレータの両方で一定の複雑さの挿入/削除を提供します。 –
申し訳ありませんが、私は(挿入)と(両端での削除)を意味しました:) – user35443