C++ std移动向量浮动[3]到向量类x、y、z

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

我有两种不同形式的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 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
。我知道,它仍然是一个副本。我想那就没办法了