std :: vector及其初始化指针一致性

时间:2015-10-23 08:44:23

标签: c++ pointers vector stl

我提供以下代码来说明我的问题,您可以在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的内容与指针始终相同?

3 个答案:

答案 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

的原因

因此,夏季矢量会从数组元素创建一组副本。因此,如果您从一个集合中更改任何元素,则它不会反映在其他集合中。