从向量初始化数组

initizlize an array from a vector

本文关键字:数组 初始化 向量      更新时间:2023-10-16
可以从

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

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

我想知道在没有显式循环的情况下是否可以反过来?是否可以使用上面的快捷方式从向量初始化数组,我想不会,但让我问......

不,初始化时无法执行此操作,但您可以使用 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),以便您也不会溢出数组。

是的,您可以从相同类型的数组初始化向量:

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

这个问题中回答的替代方案是让一个指针与 vector 的第一个变量相关联(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;
    }
}

看,在那个函数中,array[i] 就像数组一样工作,不涉及副本,没有复制开销,没有分配新内存 - 一切都很好! :)

但是,如果向量是空的,则必须小心。如果 v.size() 为零,则 &v[0] 尝试生成指向不存在的东西的指针 - 未定义的行为。更安全的方式:

if(!v.empty()){
  print_array(&v[0],v.size());
}

但是要小心字符串...他们是完全不同的野兽...

要获得有关此事的完整信息,请查看Scott Meyer的有效STL第16项。了解如何将矢量和字符串数据传递到旧版 API。

No.您可以使用

double a[] = { v[0], v[1], ... };

但更容易你无法得到。