将数组转换为向量的最简单方法是什么?


92

将数组转换为向量的最简单方法是什么?

void test(vector<int> _array)
{
  ...
}

int x[3]={1, 2, 3};
test(x); // Syntax error.

我想以最简单的方式将x从int数组转换为vector。

Answers:


138

使用vector带有两个迭代器的构造函数,请注意,指针是有效的迭代器,并使用从数组到指针的隐式转换:

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + sizeof x / sizeof x[0]);
test(v);

要么

test(std::vector<int>(x, x + sizeof x / sizeof x[0]));

在这种情况下sizeof x / sizeof x[0]显然3在哪里;这是获取数组中元素数量的通用方法。需要注意的是x + sizeof x / sizeof x[0]指向一个元素之外的最后一个元素。


1
你能解释一下吗?我已经读过这个vector<int> a(5,10);意思为make room for 5 int`并使用10对其进行初始化。但是您的x,x + ...如何工作?你可以解释吗?
阿西夫·穆什塔克

1
@UnKnown而不是vector<int>::vector(size_type, int)select vector<int>::vector(int*, int*),而是选择,它将复制该对指针表示的范围。第一种是过载(2),所述第二过载(4)此处
Caleth

1
在c ++ 11上,std :: extent比sizeof方法更好。sizeof x / sizeof x[0] == std::extent<decltype(x)>::value
艾萨克·帕斯夸

112

就我个人而言,我非常喜欢C ++ 2011的方法,因为它既不需要您使用sizeof()也无需记住调整数组的边界(如果您曾经更改过数组的边界的话,也可以根据需要在C ++ 2003中定义相关的函数。 ):

#include <iterator>
#include <vector>
int x[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(std::begin(x), std::end(x));

显然,在C ++ 2011中,您可能仍要使用初始化列表:

std::vector<int> v({ 1, 2, 3, 4, 5 });

2
是复制数组还是指向数组?我关注性能
kirill_igum 2012年

2
std::vector<T>始终拥有T对象。这有两个含义:将对象插入向量中时,将它们复制并并置在内存中。对于相当小的对象(例如短字符串序列),配置是主要的性能提升。如果对象很大且复制昂贵,则可能要存储指向对象的[以某种方式进行资源管理]指针。哪种方法更有效取决于对象,但是您可以选择。
DietmarKühl2012年

所以,如果我想连接一个c ++和一个ac库,并从c-array复制到vector并返回,没有办法支付2个副本的罚款吗?(我正在使用特征库和gsl)
kirill_igum 2012年

16

指针可以像其他任何迭代器一样使用:

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)

2
在现实生活中,您可能需要抽象出数组大小,例如使用const size_t X_SIZE = 3;来表示数组大小,或从sizeof中进行计算。为了便于阅读,我省略了该部分。
拉斐尔·拉威克

11

您在这里问的是错误的问题-不是将所有内容强制设置为向量,而是询问如何将测试转换为可与迭代器(而不是特定容器)一起使用。您也可以提供重载以保持兼容性(并免费同时处理其他容器):

void test(const std::vector<int>& in) {
  // Iterate over vector and do whatever
}

变成:

template <typename Iterator>
void test(Iterator begin, const Iterator end) {
    // Iterate over range and do whatever
}

template <typename Container>
void test(const Container& in) {
    test(std::begin(in), std::end(in));
}

这可以让您执行以下操作:

int x[3]={1, 2, 3};
test(x); // Now correct

Ideone演示


“不是将所有内容强制为向量,而是询问如何将测试转换为使用迭代器而不是特定容器来工作。” 为什么这样更好?
aquirdturtle '02

1
@aquirdturtle,因为现在,不仅支持向量,还支持列表和数组,增强容器并转换迭代器和范围以及....
Flexo

2
而且您不需要复制数据
Lightness Races in Orbit

2

一种简单的方法可以是使用assign()vector类中预定义的函数。

例如

array[5]={1,2,3,4,5};

vector<int> v;
v.assign(array, array+5); // 5 is size of array.

2
相当于使用ctor,大约在七年前的现有答案中提到了ctor。什么也没添加...
轻轨比赛(
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.