将向量转换为数组 - 是否有“标准”方法来执行此操作?

时间:2011-12-30 18:11:52

标签: c++ vector

我知道你可以这样做:&theVector[0],但这是标准吗?这种行为总是保证吗?

如果没有,是否有更好的,更少'黑客'的方式来做到这一点?

4 个答案:

答案 0 :(得分:20)

是的,这种行为是有保障的。虽然我不能引用它,但标准保证向量元素连续存储在内存中以允许这种情况。

但有一个例外:

由于模板专业化,它不适用于vector<bool>

http://en.wikipedia.org/wiki/Sequence_container_%28C%2B%2B%29#Specialization_for_bool

此专门化尝试通过在位字段中将bools打包在一起来节省内存。但是,它会破坏一些语义,因此&theVector[0]上的vector<bool>将无效。

无论如何,vector<bool>广泛considered to be a mistake,因此替代方法是使用std::deque<bool>

答案 1 :(得分:13)

C ++ 11在data()上提供std::vector方法,返回T*。这允许你这样做:

#include <iostream>
#include <vector>

int main()
{
  std::vector<int> vector = {1,2,3,4,5};
  int* array = vector.data();
  std::cout << array[4] << std::endl; //Prints '5'
}

但是,执行此操作(或上述任何方法)可能很危险,因为如果调整矢量大小,指针可能会变为无效。这可以通过以下方式显示:

#include <iostream>
#include <vector>

int main()
{
  std::vector<int> vector = {1,2,3,4,5};
  int* array = vector.data();

  vector.resize(100); //This will reserve more memory and move the internal array

  //This _may_ end up taking the place of the old array      
  std::vector<int> other = {6,7,8,9,10}; 

  std::cout << array[4] << std::endl; //_May_ now print '10'
}

这可能会崩溃或做任何事情所以要小心使用它。

答案 2 :(得分:1)

我们可以使用data()方法完成此操作。 C ++ 11提供了这种方法。 它返回一个指向向量中第一个元素的指针。 vector即使它是空的,我们也可以自己调用这个函数

  vector<int>v;
  int *arr = v.data();

答案 3 :(得分:0)

不那么'hackish'的方式?那么你可以简单地复制:

#include <iostream>
#include <vector>
using namespace std;



int main()
{ 
    vector<int> vect0r;
    int array[100];

    //Fill vector
    for(int i = 0; i < 10 ; i++) vect0r.push_back( i ) ;

    //Copy vector to array[ ]
    for(  i = 0; i < vect0r.size(); i++) array[i] = vect0r[i];

    //Dispay array[ ]
    for(  i = 0; i < vect0r.size(); i++)  cout<< array[i] <<" \n";

    cout<<" \n";

return 0;
}

更多信息:How to convert vector to array in C++