将数组转换为向量的最简单方法是什么?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
我想以最简单的方式将x从int数组转换为vector。
将数组转换为向量的最简单方法是什么?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
我想以最简单的方式将x从int数组转换为vector。
Answers:
使用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]
指向一个元素之外的最后一个元素。
sizeof x / sizeof x[0] == std::extent<decltype(x)>::value
就我个人而言,我非常喜欢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 });
std::vector<T>
始终拥有T
对象。这有两个含义:将对象插入向量中时,将它们复制并并置在内存中。对于相当小的对象(例如短字符串序列),配置是主要的性能提升。如果对象很大且复制昂贵,则可能要存储指向对象的[以某种方式进行资源管理]指针。哪种方法更有效取决于对象,但是您可以选择。
指针可以像其他任何迭代器一样使用:
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)
const size_t X_SIZE = 3;
来表示数组大小,或从sizeof中进行计算。为了便于阅读,我省略了该部分。
您在这里问的是错误的问题-不是将所有内容强制设置为向量,而是询问如何将测试转换为可与迭代器(而不是特定容器)一起使用。您也可以提供重载以保持兼容性(并免费同时处理其他容器):
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演示)
vector<int> a(5,10);
意思为make room for 5
int`并使用10对其进行初始化。但是您的x,x + ...如何工作?你可以解释吗?