我知道你可以这样做:&theVector[0]
,但这是标准吗?这种行为总是保证吗?
如果没有,是否有更好的,更少'黑客'的方式来做到这一点?
答案 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;
}