可以从包含与向量相同类型的元素的数组初始化向量,例如
double a[] ={ somevalues };
std::vector<double> vec(a, a+dimension)
我想知道如果没有明确的循环,是否可能相反?是否可以从像上面那样的快捷方式的矢量初始化数组,我想不是,但让我问......
答案 0 :(得分:7)
不,在初始化时无法执行此操作,但您可以使用STL中的一种算法:
std::vector<int> v = create_vector();
int array[100];
assert( v.size() >= 100 );
std::copy( v.begin(), v.begin()+100, array );
或者:
std::copy_n( v.begin(), 100, array );
断言是为了确保你不会超出向量的大小(这会导致未定义的行为),并限制副本(表达式中的100),这样你就不会溢出数组。
答案 1 :(得分:2)
是的,您可以从相同类型的数组中初始化矢量:
int a[] = {16,2,77,29};
vector<int> v (a, a + sizeof(a) / sizeof(*a) );
您可以使用std :: copy将矢量复制到数组
copy( v.begin(), v.begin()+MAX_SIZE, a); // or v.end() if a is large enough to hold the whole vector
答案 2 :(得分:0)
替代这个问题的答案是有一个与vector的第一个变量相关联的指针(向量位于连续的内存中):
假设以下向量:
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
我们的指针:
int *num_arr = &v[0];
优点 - 不是通过创建vec.capacity()大小的新动态数组来增加内存量,而是指向vec的第一个元素,使用它可以执行与普通数组相同的操作,除了你必须传递大小,但无论如何你无法通过sizeof(array)/ sizeof(* array)来估计动态分配数组的大小。
调用函数:
print_out_array(&v[0], v.size());
你可以有一个打印出“数组”的函数:
print_out_array(const int* array, std::size_t size){
cout << "Printing out array:" << endl;
for (int i=0; i != size; ++i){
cout << "i: " << i << ", value: " << array[i] << endl;
}
}
请参阅,函数数组[i]就像数组一样,不涉及副本,没有复制开销,没有分配新内存 - 一切都很好! :)
但是如果向量是空的,你必须要小心。如果v.size()为零,那么&amp; v [0]会尝试生成一个指向不存在的东西的指针 - 未定义的行为。 更安全的方式:
if(!v.empty()){
print_array(&v[0],v.size());
}
但要注意字符串......它们是完全不同的野兽......
要获得有关此事项的完整信息,请查看Scott Meyer的有效STL项目16.了解如何将矢量和字符串数据传递给旧API。
答案 3 :(得分:-2)
没有。你可以使用
double a[] = { v[0], v[1], ... };
但你更容易得到。