我有一个包含对象的向量:
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循环中,但这是最干净(或最有效)的解决方案吗?
你可以用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)