我有这样的方法
void foo(std::vector<std::array<int, 3>> iVec){
....
}
我不想更改此方法,但是我需要将此向量std::vector<int>
据我了解,这两个向量占用相同的内存...因此,理论上,我可以使用方法std::move
照原样移动此向量。但是这个向量的大小是不同的..所以...我不知道...
一个人告诉我,如果更改将获得两个int指针的函数,则是有可能的,因此这是可能的。
但是我不明白没有一个例子意味着什么...如果有人可以提供一个例子,我真的很感激。
但是无论如何,问题仍然是:是否有可能将我的向量作为具有其他类型的函数参数传递。如果是,那怎么办?
随意提问
答案 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){
....
}
现在传递begin
和end
可能的任何容器。但是,如果您想返回将迭代器传递给std::vector<std::array<int, 3>>
的方法,则必须付出额外的努力才能获得一个迭代器类型,该类型允许您从[0][0]
到[size_x][size_y]
进行迭代,但是数组的大小均为3,这不应该太复杂。无论如何,您都应该考虑使用平面向量而不是2D结构。