1

イテレータ begin と end で示されるコンテナの値を逆にする関数を微調整しています。

なぜこれが機能するのですか:

template<class Bi> void reverse(Bi begin, Bi end){
    while (begin!= end) {
        --end;
        if (begin != end)
            swap(*begin++, *end);
    }
}

しかし、これではありませんか?

template<class Bi> void reverse(Bi begin, Bi end){
    while (begin != end) {
        --end;
        if (begin != end){
            Bi temp = begin;
            Bi temp2 = end;
            *begin = *temp2;
            *end = *temp;
            begin++;
        }
    }
}

これは問題なくコンパイルされますが、互いに等しいイテレータを割り当てることについて何か誤解しているに違いありません。たとえば、値 1 ~ 5 のベクトルを逆にすると、最初のベクトルが 5 ~ 1 になるためです。 2 番目の値は 5、4、3、4、5 になります。この動作がわかりません。何が問題なのですか?

4

2 に答える 2

4

イテレータと値の概念が混在しています。2 番目のアプローチでは、反復子をコピーしますが、値はコピーしません。同じ要素を参照するので、beginと も参照します。最初の要素を5 に設定すると、後で最初の要素 (既に 5 に設定されています) が最後の位置にコピーされ、最初と最後の位置の両方が のままになります。tempendtemp2*begin = *temp2;*end=*temp5

あなたがする必要があるのは、反復子ではなく値をコピーすることです。

于 2012-10-28T02:34:52.383 に答える
2

問題はここにあります:

Bi temp = begin;
Bi temp2 = end;

最初の行は、イテレータの位置beginを参照先に割り当てますtemp。そのtempため、コンテナ内の と同じ位置を参照するようになりましたbegin

次に、その位置に格納されている値を変更します。

*begin = *temp2;

もちろん、 はtempまだその位置を参照しているため*temp、変更された値も表すようになりました。

したがって、これは:

*end = *temp;

に間違った値を割り当てます*end(実際、新しい値はまったく割り当てません)。

于 2012-10-28T02:35:26.657 に答える