1

マルチマップのすべての要素を繰り返し処理しようとしていますが、何らかの理由で最初の 2 つの要素を超えると機能しなくなります。

これは、反復に使用しているコードです。

    for(noteIT = trackIT->noteList.begin(); noteIT != trackIT->noteList.end(); noteIT++){
        cout << "noteList size is: " << (int) trackIT->noteList.size() << endl;
        cout << "---" << noteIT->second.getName() << endl;
    }

これは私が得る出力です:

noteList size is: 3
---note1
noteList size is: 3
---note2

しかし、マルチマップ内に 2 つ以上の要素があるため、ここに追加します。

// create notes
Note note1(440, 100, 8, 1, 1);
note1.setName("note1");
Note note2(220, 100, 8, 1, 9);
note2.setName("note2");
Note note3(880, 100, 8, 1, 17);
note3.setName("note3");

synthTrack.addNote(note1);
synthTrack.addNote(note2);
synthTrack.addNote(note3);

addNote メソッドは次のようになります。

void Track::addNote(Note &note) {
//  long key = note.getMeasureNumber() * 1000000 + note.getStartTime();
    long key = 1000009;
    this->noteList.insert(make_pair(key, note));
}

マルチマップは同じキーを数回持つことができるので、現在はすべてのキーが等しいですが、それは問題ではありません。私が間違っている可能性のあるアイデアはありますか?

編集

これが実行例です。悲しいことに、この例は正常に機能し、noteList に追加された 3 つのメモを示しています。ただし、上記のコードは機能せず、その理由はわかりません。

4

1 に答える 1

0

コードパッドの例から、問題はループgetTracklist()内で呼び出している方法にあります。for

を呼び出すたびに、 のコピーgetTracklist()返されます。したがって、ループ内で実行することにより、 の 1 つのコピーのイテレータと の別のコピーのイテレータを比較しています。tracklisttrackIT < playlist.getTracklist().end()fortracklisttracklist

これを回避する安全な方法は、ループtracklistの前にローカル変数にコピーして使用することです。for

vector<Track> tracklist(playlist.getTracklist());
for(trackIT = tracklist.begin(); trackIT != tracklist.end(); ++trackIT){


別の方法は、forループをそのままにして、ゲッターを次のように変更するtracklistことです。

vector<Track>& getTracklist() { return tracklist; }

への参照を返すことにより、tracklistイテレータを同じ実際のオブジェクトと比較します。ただし、この方法はかなりリスクが高く、おそらく最後の手段としてのみ使用する必要があります。


余談ですが、通常<、preferを使用してイテレータを比較するのは適切な計画ではありません!=。コンテナーは であるため、これはここで機能しますがstd::vector、将来別のコンテナー タイプに変更すると、未定義の動作が発生する可能性があります。

于 2012-04-24T16:36:53.060 に答える