2012-03-01 81 views
1

我想有一個向量z,並且能夠以z[i]*pz[i]訪問它,其中*pz[i]指向z[i]。所以有一組值,但有兩種訪問方式。指向另一個矢量而不是克隆矢量元素的向量的向量

這是我的代碼:

std::vector<double> z; 
std::vector<double*> pz; 

for (int i = 0; i < 5; i++) { 
    z.push_back(7+0.01*i); 
    std::cout << i << " z = " << z << std::endl; 
    pz.push_back(&z.back()); 
    std::cout << i << " pz = " << pz << std::endl; 
    std::cout << i << " *pz = " ; 
    for (int j = 0; j < pz.size(); j++) { 
    std::cout << " " << *pz[j]; 
    } 
    std::cout << std::endl; 
} 

z[1]=17.3; 
std::cout << "z[1] = " << z[1] << std::endl; 
std::cout << "*pz[1] = " << *pz[1] << std::endl; 

*pz[2]=34.1; 
std::cout << "z[2] = " << z[2] << std::endl; 
std::cout << "*pz[2] = " << *pz[2] << std::endl; 

輸出:

0 z = vector(1) [ 7 ] 
0 pz = vector(1) [ 0x1d00b80 ] 
0 *pz = 7 
1 z = vector(2) [ 7, 7.01 ] 
1 pz = vector(2) [ 0x1d00b80, 0x1d00bc8 ] 
1 *pz = 1.50254e-316 7.01 
2 z = vector(3) [ 7, 7.01, 7.02 ] 
2 pz = vector(3) [ 0x1d00b80, 0x1d00bc8, 0x1d00bf0 ] 
2 *pz = 1.50254e-316 7.01 7.02 
3 z = vector(4) [ 7, 7.01, 7.02, 7.03 ] 
3 pz = vector(4) [ 0x1d00b80, 0x1d00bc8, 0x1d00bf0, 0x1d00bf8 ] 
3 *pz = 1.50254e-316 7.01 7.02 7.03 
4 z = vector(5) [ 7, 7.01, 7.02, 7.03, 7.04 ] 
4 pz = vector(5) [ 0x1d00b80, 0x1d00bc8, 0x1d00bf0, 0x1d00bf8, 0x1d00c60 ] 
4 *pz = 1.50254e-316 7.01 7.02 7.03 7.04 
z[1] = 17.3 
*pz[1] = 7.01 
z[2] = 7.02 
*pz[2] = 34.1 

有3個問題:

  1. *pz第一元件被第二按壓後未定義。
  2. 當我分配z[1]時,*pz[1]不再是z[1]了。
  3. 當我指定*pz[2]時,它不再分配給z[2]了。

(在我實際的程序我需要有一個載體來訪問偶數元素和訪問奇數元素的載體,但我不想做一個克隆,並使用更多的內存。)

回答

7

兩件事:

  1. 當你這樣做,可能會導致重新分配的載體push_back()或任何操作,你所有指針無效於矢量的元素。
  2. 在64位中,指針可能與double的大小相同,因此您不會以這種方式保存任何內存。

如果您確實想要創建第二個向量指向第一個向量的元素,則需要先完成第一個向量的構建。否則,push_back()操作將使指針失效。