将数组转换为向量最简单的方法是什么?
将数组转换为向量最简单的方法是什么?
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演示 )