2

Gグラフであるオブジェクトがあります。頂点の隣接関係のリストである (STL リスト) をG[i]返すように、ブラケット演算子をオーバーロードしました。list<int>i

私はこれら 2 つのコード セグメントを持っていますが、どちらも を反復処理することになっていますがG[i]、最初の 1 つだけが機能します。

list<int> adj = G[2];

for(list<int>::iterator it = adj.begin(); it != adj.end(); it++) {
    cout << *it << " ";
}

これは動作しません...

for(list<int>::iterator it = G[2].begin(); it != G[2].end(); it++) {
    cout << *it << " ";
}

私が見る限り、彼らは同じことをしています。2 番目のコード セグメントが機能しない理由を説明できる人はいますか? また、私のリストを反復処理するより良い方法はありますか?

4

2 に答える 2

5

G[i]を返すように、ブラケット演算子をオーバーロードしましたlist<int>

operator []の戻り値の型がlist<int>&ではなくであることを確認してくださいlist<int>。そうしないと、 を呼び出すたびに戻るときにコピーが作成されるG[2]ため、G[2].end()到達することはありません。

[]を特徴とする最初のコード フラグメントで行った方法で 1 回呼び出した場合adj、問題は表示されません (ただし、リストは 2 回コピーされます - 1 回は で、returnもう 1 回は代入演算子で)。2 番目のフラグメントは、[]オペレーターを複数回呼び出すことによって問題を明らかにします。

于 2013-05-18T01:46:33.480 に答える