C++ std移动向量浮动[3]到向量类x、y、z
我有两种不同形式的3个值的向量,我想从一个传递到另一个:C++ std移动向量浮动[3]到向量类x、y、z,c++,vector,C++,Vector,我有两种不同形式的3个值的向量,我想从一个传递到另一个: 一个std::vector,std::vector或者甚至float[][3](这是我可以更改的部分) color类的std::vector 让我们使用这些类: class color{ float x,y,z; //some methods but no other member } 我想做的是: std::vector<float[3]> myVector; // already allocated
- 一个
,std::vector
或者甚至std::vector
(这是我可以更改的部分)float[][3]
类的color
std::vector
class color{
float x,y,z;
//some methods but no other member
}
我想做的是:
std::vector<float[3]> myVector; // already allocated and filled
std::vector<color> cv = std::move( myVector ); // of course does not compile
std::vector myVector;//已分配和填充
std::vector cv=std::move(myVector);//当然不会编译
我的问题是,我不知道如何在不重新分配内存的情况下将一个转换为另一个。
我可以使用static\u cast
将float[3]
转换为color
,但它似乎不适用于向量
我不想遍历整个数组,只想将数据从myVector
移动到cv
向量中。我认为将myVector
的指针转换为void*
然后再转换为color3*
可以工作,但我没有成功
想法?在C++20之前,您根本不能拥有
std::vector
,因为float[3]
不满足std::vector
所具有的值类型的要求。自从C++20以来,它在技术上是允许的,但在实践中仍然没有用处,因为任何添加元素的成员函数仍然有数组不能满足的需求
假设您问了一个类似的问题,其中有两个不同的类,一个是color
,另一个包含一个数组作为成员。例如std::array
我不想迭代整个数组,而只是将数据从myVector移到cv向量中
这是无法避免的。将数据“移动”到向量中而不进行迭代的唯一方法是从另一个相同类型的向量移动。这种单一情况不适用于不同类型的情况,所以必须进行迭代。您不一定需要自己编写循环,因为您可以使用标准算法。以下是使用标准范围的示例:
std::vector<std::array<float,3>> myVector; // already allocated and filled
std::vector<color> cv;
auto arr_to_color = [](const std::array<float,3>& arr){
// assuming such constructor exists
return color(
arr[0],
arr[1],
arr[2]);
};
std::ranges::transform(
myVector,
std::back_inserter(cv),
arr_to_color);
std::vector myVector;//已分配和填充
std::载体cv;
自动排列到颜色=[](常量标准::数组和排列){
//假设存在这样的构造函数
返回颜色(
arr[0],
arr[1],,
arr[2]);
};
std::ranges::transform(
myVector,
标准:背面插入器(cv),
arr_至_颜色);
我可以使用static\u cast将浮点[3]转换为颜色。不,你不能。如果你想移动数据,它需要堆分配,而对于3个浮点数,它可能不值得。我认为尝试避免复制是合理的,也许我们可以使用自定义的分配器来尝试。@prehistoricpenguin你可以首先从std::vector
开始避免复制,或者从不转换为std::vector
。但实际内存是相同的,不是吗?在内存中,当float=4B时,我会有12B的颜色,x,y,z,而对于float[3]或std::array,这是一样的,我错了吗?难道不能把它变成一个空*吗?@Patafikss你可以用void*
指向它。但这样做无助于创建一个std::vector
。我知道,它仍然是一个副本。我想那就没办法了