从向量初始化数组

时间:2011-05-18 22:33:41

标签: c++

可以从包含与向量相同类型的元素的数组初始化向量,例如

double a[] ={ somevalues };
std::vector<double> vec(a, a+dimension)

我想知道如果没有明确的循环,是否可能相反?是否可以从像上面那样的快捷方式的矢量初始化数组,我想不是,但让我问......

4 个答案:

答案 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], ... };

但你更容易得到。