2012-03-01 83 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()操作将使指针失效。