我提供以下代码来说明我的问题,您可以在http://cpp.sh/
中找到它们// Example program
#include <iostream>
#include <string>
#include <vector>
int main()
{
int *p;
p = new int [10];
for(int i=0; i<10; i++)
p[i] = i;
std::vector<int> vecArray(p,p+10);
vecArray[3]=300;
for(int i=0; i<10; i++)
std::cout<<vecArray[i]<<std::endl;
for(int i=0; i<10; i++)
std::cout<<p[i]<<std::endl;
delete []p;
}
从代码中我们可以看到,在使用指针p
初始化向量vecArray
之后,当向量的内容被更改时,它将不会在指针中包含内容。我的问题是:如何才能使vctor的内容与指针始终相同?
答案 0 :(得分:4)
向量的内容是动态分配的数组内容的副本。
您需要了解您的示例代码分配10个整数 TWO 次,一次是在您明确调用new
时,另一次是在构建vector
时。< / p>
你可以让两者共享相同的内存,例如,首先构建你的向量,然后得到一个指向它的数据的指针:
#include <iostream>
#include <vector>
int main(void)
{
std::vector<int> vecArray(10);
for(int i=0; i<10; i++)
vecArray[i] = i;
const int* p = vecArray.data();
vecArray[3]=300;
for(int i=0; i<10; i++)
std::cout<<vecArray[i]<<std::endl;
for(int i=0; i<10; i++)
std::cout<<p[i]<<std::endl;
}
答案 1 :(得分:2)
您可以让vector
包含指向int
的指针。
您可以插入动态分配数组的矢量地址。
#include <iostream>
#include <string>
#include <vector>
int main()
{
int *p;
p = new int [10];
for(int i=0; i<10; i++)
p[i] = i;
std::vector<int*> vecArray;
for(int i=0; i<10; i++)
vecArray.push_back(&p[i]); //push_back addresses in the vector
p[3]=300; //you can also: *(vecArray[3])=300;
for(int i=0; i<10; i++)
std::cout<<*vecArray[i]<<std::endl; // Deference your pointer to get the value
for(int i=0; i<10; i++)
std::cout<<p[i]<<std::endl;
delete []p;
}
答案 2 :(得分:1)
这是使用范围
的vector
的构造函数
template <class InputIterator> vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
这就是描述:
Range constructor: Constructs a container with as many elements as the range [first,last), with each element emplace-constructed from its corresponding element in that range, in the same order.
它从相应的元素中说出e mplace-constructed
。所以这意味着它创建了一个由指针指向的对象的新副本。
这就是The underlying type an std::vector uses must be CopyAssignable
因此,夏季矢量会从数组元素创建一组副本。因此,如果您从一个集合中更改任何元素,则它不会反映在其他集合中。