C++将包含对象的向量转换为包含双精度的向量

C++ convert vector containing objects to vector containing doubles

本文关键字:向量 包含 双精度 转换 C++ 对象      更新时间:2023-10-16

我有一个包含对象的向量:

std::vector<myObjectType> myObjectVector;

myObjectType包含一个名为value的双成员变量,我可以通过两种方式检索它:

myObjectType aObject;
double aObjectDouble = aObject(); // possibility 1 (overloaded operator)
double aObjectDouble = aObject.get_value(); // possibility 2

现在我可以将std::vector<myObjectType> myObjectVector转换为std::vector<double> myObjectVectorDoubles,其中std::vector<double>包含每个对象的双值,如下所示:

std::vector<double> myObjectVectorDoubles;
myObjectVectorDoubles.push_back(myObjectVector[0].get_value());
myObjectVectorDoubles.push_back(myObjectVector[1].get_value());
...
...

或者简单地通过这种方式

std::vector<double> myObjectVectorDoubles;
myObjectVectorDoubles.push_back(myObjectVector[0]());
myObjectVectorDoubles.push_back(myObjectVector[1]());
...
...

我可以把它放在for循环中,但这是最干净(或最有效)的解决方案吗?

您可以使用std::transform。例如,如果您有class

class Foo {
  double val;
public:
  Foo() = default;
  Foo(double const val_) : val(val_) {}
  double getVal() const { return val; }
};

在你的程序做:

std::vector<Foo> v {{1.2}, {2.3}, {5.6}};  
std::vector<double> dv(v.size());
std::transform(v.begin(), v.end(), dv.begin(), [](auto const &f) { return f.getVal(); });

实时演示

如果您的编译器不支持C++14通用lambdas,请更改为:

std::transform(v.begin(), v.end(), dv.begin(), [](Foo const &f) { return f.getVal(); });

试试这个,但要使用您的对象:

std::vector<int> ivec({1,2,3,4,5,6,7,8,9});
std::vector<double> dvec;
for(auto&& x : ivec)
    dvec.push_back(double(x));

所以在你的情况下:

std::vector<myObjectType> myObjectVector {...}
std::vector<double> myDoubleVector;
for(auto&& x : myObjectVector)
        myDoubleVector.push_back(x.get_value());

我知道这不是你想要的,但我自己做了一个小实验:

#include <iostream>
#include <vector>
class Foo {
public:
    double value;
    Foo(double v) :
        value{ v } {}
    operator double() {
        return value;
    }
};
int main(int argc, char* argv[]) {
    std::vector<Foo> foos{ 1.0, 3.0, 4.0, 7.0 };
    for(double d : foos) {
        std::cout << d << ", ";
    }
}

它奏效了。我不知道你的情况,但正如我上面所展示的,你甚至可能不需要将你的对象向量转换为二重向量。