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

Pie*_*air 2 c++ vector

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

std::vector<myObjectType> myObjectVector;
Run Code Online (Sandbox Code Playgroud)

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

myObjectType aObject;
double aObjectDouble = aObject(); // possibility 1 (overloaded operator)
double aObjectDouble = aObject.get_value(); // possibility 2
Run Code Online (Sandbox Code Playgroud)

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

std::vector<double> myObjectVectorDoubles;
myObjectVectorDoubles.push_back(myObjectVector[0].get_value());
myObjectVectorDoubles.push_back(myObjectVector[1].get_value());
...
...
Run Code Online (Sandbox Code Playgroud)

或者就是这样

std::vector<double> myObjectVectorDoubles;
myObjectVectorDoubles.push_back(myObjectVector[0]());
myObjectVectorDoubles.push_back(myObjectVector[1]());
...
...
Run Code Online (Sandbox Code Playgroud)

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

101*_*010 5

你可以用std::transform.例如,如果你有一个class

class Foo {
  double val;
public:
  Foo() = default;
  Foo(double const val_) : val(val_) {}
  double getVal() const { return val; }
};
Run Code Online (Sandbox Code Playgroud)

在你的程序中做:

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(); });
Run Code Online (Sandbox Code Playgroud)

现场演示

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

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