是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?



我有这样的方法

void foo(std::vector<std::array<int, 3>> iVec){
....
}

我不想更改此方法,但我需要将此向量作为参数传递std::vector<int>

据我了解,这两个向量占用相同的内存......因此,理论上我可以使用方法std::move按原样移动此向量。但是这个向量有不同的大小。所以。。。我不知道。。。

一个人告诉我,如果改变函数,它可能会得到两个 int 指针,所以这是可能的。

但是我不明白没有例子是什么意思......如果有人能举个例子,我真的很感激。

但无论如何,问题仍然是:是否可以将我的向量作为具有另一种类型的函数参数传递。如果是,那如何?

随便问

C++标准不保证sizeof(std::array<MyType, N>)==sizeof(MyType)*N。也就是说,即使单个std::array的元素是连续的,arrays 的vector也可能不均匀分布数组的元素。因此,没有符合标准的方法可以做到这一点,因为两个向量不一定"占用相同的内存"。

您也许可以在编译器上与reinterpret_cast等一起使用。(来自重新解释的向量类型的std::move肯定是行不通的,理论上不行,在实践中也不行。这将不是便携式的,可靠的或好主意。您有三个选项:复制数据、更改源类型或更改目标类型。

我不想改变这种方法...

但你应该。如果你让它与迭代器而不是容器一起工作,你将获得更大的灵活性:

template <typename IT>
void foo(IT begin, IT end){
....
}

现在传递beginend任何可能的容器。但是,如果你想回到将迭代器传递给std::vector<std::array<int, 3>>你必须投入一些额外的努力来获得一个迭代器类型,让你从[0][0]迭代到[size_x][size_y],但由于数组的大小都是3,这不应该太复杂。无论如何,您应该考虑使用平面矢量而不是 2D 结构。

最新更新