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

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

void test(vector<int> _array) { ... } int x[3]={1, 2, 3}; test(x); // Syntax error. 

我想以最简单的方式将int数组中的x转换为向量。

使用带两个迭代器的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]指向最后一个元素之外的一个元素。

就个人而言,我非常喜欢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 }); 

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

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

你在这里问错误的问题 – 而不是强迫所有的东西变成一个向量,问你如何将testing转换为迭代器而不是特定的容器。 您也可以提供一个重载以保持兼容性(同时免费处理其他容器):

 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演示 )