将std::array转换为std::vector

8
在下面的代码中,函数(foo)的参数大小( std :: vector )可以是任何值,使函数成为通用函数。但是,有时要使用std :: array知道大小容器。问题是将 std :: array 转换为 std :: vector 。解决这个问题的最佳方法是什么?在这种情况下始终只使用 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 修改了向量,因为它采用可变引用,这是正确的吗?这对答案非常重要。 - Mooing Duck
现在你必须绕过它工作,但是将来我们会编写类似void foo(RangeOf<int>&);的东西,它将接受任何类型的int范围。 - Joseph Mansfield
1
这个问题就是为什么标准库总是使用 beginend 迭代器。这样它就不关心你使用哪种容器了。 - Mark Ransom
1
// 大小已知,为什么要使用std::vector?-- 为什么使用std::vector呢? - David Rodríguez - dribeas
你可以编写一个类似于llvm::MutableArrayRef的包装类型。 - yachoor
2个回答

16

假设您传入一个arrayfoo似乎不会调整传递给它的容器的大小(但是它似乎会修改元素,因为vec是非const传递的)。因此,它不需要知道关于底层容器的任何信息,只需知道如何访问元素。

然后,您可以像许多STL算法一样传递一对迭代器(并将迭代器类型作为模板参数)。


另外,如果你想避免将其变成模板,则可以使用 int* firstsize_t count 作为参数。 - Mooing Duck
3
@MooingDuck:int *begin, int *endint *first, size_t count更符合C++的风格。 - Nawaz
STL是否支持范围的概念(一对迭代器),还是我必须手动获取begin()和end()? - Michael

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接