是否可以不通过复制将std :: vector <int>作为获取std :: vector <std :: array <int,3 >>的参数进行娱乐?

时间:2019-09-11 10:30:34

标签: c++

我有这样的方法

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

我不想更改此方法,但是我需要将此向量std::vector<int>

作为参数传递

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

  

一个人告诉我,如果更改将获得两个int指针的函数,则是有可能的,因此这是可能的。

但是我不明白没有一个例子意味着什么...如果有人可以提供一个例子,我真的很感激。

但是无论如何,问题仍然是:是否有可能将我的向量作为具有其他类型的函数参数传递。如果是,那怎么办?

随意提问

2 个答案:

答案 0 :(得分:2)

C ++标准不保证sizeof(std::array<MyType, N>)==sizeof(MyType)*N。也就是说,即使单个std::array的元素是连续的,vector中的array也可能没有使数组的元素均匀间隔。因此,没有标准的兼容方法,因为两个向量不一定一定是“占用相同的内存”。

您也许可以使reinterpret_cast等在编译器上使用。 (来自重新解释的向量类型的std::move肯定在理论上和实践上都不有效。)这将不是可移植的,可靠的或一个好主意。您有三个选择:复制数据,更改源类型或更改目标类型。

答案 1 :(得分:0)

  

我不想更改此方法...

但是你应该。如果您使用迭代器而不是容器,它将获得更大的灵活性:

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

现在传递beginend可能的任何容器。但是,如果您想返回将迭代器传递给std::vector<std::array<int, 3>>的方法,则必须付出额外的努力才能获得一个迭代器类型,该类型允许您从[0][0][size_x][size_y]进行迭代,但是数组的大小均为3,这不应该太复杂。无论如何,您都应该考虑使用平面向量而不是2D结构。