1

リンク リスト内の文字列をアルファベット順に並べ替えるコードを作成しようとしています。ここに私が書いたものがあります:

void main() {
list<string> myList;
list<string>::iterator pos;

string newData;
myList.push_back("Anna");

pos = myList.begin();

for (int i = 0; i < 5; i++){
    cin >> newData;
    while(newData > *pos)
        pos++;

    myList.insert(pos, newData);
}

system("pause");
}

このコードは正常にコンパイルされますが、実行するとリスト イテレータが参照解除できないというエラーが表示されます。

私はリンクされたリストとイテレータに非常に慣れていないので、修正方法が本当にわかりません。どんな助けでも大歓迎です!

4

3 に答える 3

4

問題はこのサイクルにあります:

while(newData > *pos)
    pos++;

入力によってposは、リストの最後に到達するまで増加し続ける場合があります。その時点で、whileループの状態をチェックするときにそれを逆参照すると、 Undefined Behaviorが発生します。

プログラムを修正するには、サイクルを次のように書き換えます。

while ((pos != myList.end()) && (newData > *pos))
{
    pos++;
}

PS: また、アイテムを逆の辞書式順序で挿入することを意図している場合は、pos = myList.begin();ステートメントをループ内に移動する可能性が高いことに注意してください (そうであるように)。for

于 2013-02-14T22:49:24.853 に答える
1
while(newData > *pos)
    pos++;

の場合pos++、それlist::end()は未定義の*pos動作です。

とにかくあなたのリストはソートされていません.list::push_back

for (int i = 0; i < 5; i++){
    cin >> newData;
    myList.push_back(newData);
}

次に、後で並べ替えます。

  myList.sort();
于 2013-02-14T22:49:40.637 に答える
0

を実行しているpos++ときに、リストの最後、つまり に到達する場合がありますpos == myList.end()

その時点で、さらに*posまたはpos++違法です。

このような不正な命令を回避するには、ループ ロジックを修正する必要があります。

于 2013-02-14T22:48:10.307 に答える