2 つのベクトルの要素の交換に問題があるようです。タイプ のオブジェクトを保持する2 つのベクトルがx
あります。にはpublic メンバーが 1 つだけあります。のメンバーを指すポインターのベクトルを作成し、ベクトルとを交換します。ポインターのベクトルが のメンバーを指していることを期待しますが、そうではないようです。y
myclass
myclass
w
w
x
x
y
w
x
これは私の問題を再現する簡単な例です。
#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;
}
x
とy
は要素を交換しましたが、 はpx
まだ古い要素を指していることに注意してください。swap
usingがポインター/イテレーターを無効にすることは想定されていないことを読みました。これは正しいですか、それとも何か不足していますか? 前もって感謝します!