2014-07-22 102 views
8

在下面的代码中,函数(foo)参数(std::vector)的大小可以是使函数成为通用函数的任何东西。但是,有时大小容器已知,因此可以使用std :: array。问题是将std::array转换为std::vector。解决这个问题的最好方法是什么?总是在这种情况下使用std::vector是否更好?将std :: array转换为std :: vector

#include <iostream> 
#include <array> 
#include <vector> 

using namespace std; 

// generic function: size of the container can be anything 
void foo (vector<int>& vec) 
{ 
    // do something 
} 

int main() 
{ 
    array<int,3> arr; // size is known. why use std::vector? 
    foo (arr); // cannot convert std::array to std::vector 

    return 0; 
} 
+1

我假设'foo'修改了矢量,因为它是通过可变参考引用的,这是否正确?这将与答案非常相关。 –

+0

现在你必须要解决它,但是将来我们会写'void foo(RangeOf &);'并且它会采用任何一种'int'范围。 –

+1

这个问题是为什么标准库总是需要'begin'和'end'迭代器。这样它并不关心你使用哪个容器。 –

回答

15

既然你在array通过,foo似乎并没有调整它得到通过的容器(但是,它似乎因为vec传递非const修饰的元素)。因此,除了如何访问元素外,它不需要知道底层容器的任何信息。

然后,您可以通过通过一对迭代器(并使迭代器类型为模板参数),就像很多STL算法一样。

+0

另外,如果你想避免使它成为一个模板,参数可能是'int * first'和'size_t count' –

+3

@MooingDuck:'int * begin,int * end'将比'int * first,size_t count'更为C++。 – Nawaz

0

该函数通过引用接受向量。因此,将std :: array类型的对象传递给函数没有任何意义。如果函数的参数将被定义为对向量的常量引用,那么它可能有意义。

相关问题