2012-01-08 50 views

回答

92

使用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在这方面;这是获取数组中元素数量的通用方法。请注意0​​指向一个元素超出最后一个元素。

+1

你能解释一下吗?我已经读过'vector a(5,10);'意思是为5'int'腾出空间并用10初始化它们。但是,你的x,x + ...是如何工作的?你可以解释吗? – UnKnown 2016-01-16 07:19:38

11

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

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

在现实生活中,您可能想要抽象出数组大小,例如使用'const size_t X_SIZE = 3;'来表示数组大小,或者从sizeof计算它。为了便于阅读,我省略了该部分。 – 2012-01-08 12:50:43

77

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

它复制数组还是只是指向它?我关注性能 – 2012-11-07 18:06:21

+1

'std :: vector '总是拥有'T'对象。这具有两个含义:将对象插入到矢量中时,它们被复制,并且它们在内存中并置。对于相当小的物体,例如短串的序列,搭配是一个主要的性能增益。如果你的对象很大且昂贵,你可能需要存储[某种资源管理]指向对象的指针。哪种方法更有效率取决于对象,但您有选择。 – 2012-11-07 22:16:57

+0

因此,如果我想连接一个C++和一个C库,并从C数组复制到矢量并返回,没有办法支付2个副本的处罚?(我正在使用eigen库和gsl) – 2012-11-08 00:14:08

4

你在这里提出错误的问题 - 而不是强迫所有事情成为一个向量,问你如何将测试转换为迭代器而不是特定的容器。你可以为了保持兼容性提供过载过(并且同时免费办理其他容器):

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 demo

+0

“,而不是强迫所有东西进入向量,询问如何将测试转换为使用迭代器而不是特定容器。”为什么这更好? – aquirdturtle 2016-02-02 20:23:38

+0

@aquirdturtle因为现在,而不是只支持载体,你支持列表和数组,并提升容器和转换迭代器和范围和.... – Flexo 2016-02-02 21:03:06

相关问题