3

2 つのベクトルの要素の交換に問題があるようです。タイプ のオブジェクトを保持する2 つのベクトルがxあります。にはpublic メンバーが 1 つだけあります。のメンバーを指すポインターのベクトルを作成し、ベクトルとを交換します。ポインターのベクトルが のメンバーを指していることを期待しますが、そうではないようです。ymyclassmyclasswwxxywx

これは私の問題を再現する簡単な例です。

#include <iostream>
#include <vector>

using namespace std;

struct myclass
{
    double w;
};


int main()
{
    vector<myclass> x(10);
    for(int i=0; i!=10; i++) x[i].w = i;
    for(auto el : x) std::cout << el.w << std::endl; /* prints i */
    std::cout << std::endl;

    vector<double *> px(10);
    for(int i=0; i!=10; i++) px[i] = &x[i].w;
    for(auto el : px) std::cout << *el << std::endl; /* prints i */
    std::cout << std::endl;

    vector<myclass> y(10);
    for(int i=0; i!=10; i++) y[i].w = 2*i;
    for(auto el : y) std::cout << el.w << std::endl; /* prints 2*i */
    std::cout << std::endl;

    y.swap(x);

    for(auto &el : x) std::cout << &el.w << " " << el.w << std::endl; /* prints 2*i as it should */
    std::cout << std::endl;

    for(auto &el : px) std::cout << el << " " << *el << std::endl; /* should print 2*i, but prints i */
    std::cout << std::endl;
}

xyは要素を交換しましたが、 はpxまだ古い要素を指していることに注意してください。swapusingがポインター/イテレーターを無効にすることは想定されていないことを読みました。これは正しいですか、それとも何か不足していますか? 前もって感謝します!

4

1 に答える 1

5

ポインターと反復子は無効化されませんが、コンテナーの内容に従います。

の内容はxにスワップされyますが、イテレータとこれらの値へのポインタは (現在 にあるにもかかわらず) それらを指し続けますy

考えてみてください。他の方法でどのように機能するのでしょうか? 長さが等しくない 2 つのコンテナーが交換された場合、長いコンテナーの末尾近くにある要素へのポインターは、短いコンテナーで何を指しますか? ポインターが有効なままであることを確認するために、各コンテナーの要素をメモリ内で移動する必要がある場合、どのように実装できswap()ますか?O(1)

于 2012-12-28T00:06:45.500 に答える