gpt4 book ai didi

c++ - 从类实例 vector 中提取类成员(作为新 vector )

转载 作者:太空宇宙 更新时间:2023-11-03 10:30:52 25 4
gpt4 key购买 nike

我有一个类/结构如下:

struct MyStruct {
std::string member_one;
std::string member_two;
};

我创建了一个 MyStruct 的 vector , std::vector<MyStruct>一定长度N成员设置为自定义值:

std::vector<MyStruct> my_struct_vect(10);
// initialize class instances

现在我想提取第一个成员memberOne成一个新的载体。我可以这样做:

std::vector<std::string> member_one_vect(my_struct_vect.size());
for (size_t i = 0; i < my_struct_vect.size(); ++i) {
member_one_vect[i] = my_struct_vect[i].member_one;
}

我的问题是,是否有一种更快/更优雅/更简洁的方式来执行此操作而不必每次都编写自定义循环?例如,在 Python 中,我可以通过推导式很容易地做到这一点。我不希望在 C++ 中有类似的东西,但我想知道是否有某种方法可以简化它。

更新

感谢对使用 std::transform 的好评和 boost::adaptors::transformed .这些非常有用,但为了紧凑,值得注意的是它们依赖于 C++11 中引入的 lambda 函数(可以在没有它们的情况下使用它们,但这需要定义一个单独的辅助函数)。

那么对于奖励积分,有什么方法可以在 C++03 中以紧凑的方式做到这一点?

最佳答案

你可以使用 std::transform :

#include <algorithm> // Necessary for std::transform()

// ...

std::vector<std::string> member_one_vect(my_struct_vect.size());

std::transform(
my_struct_vect.begin(), my_struct_vect.end(), member_one_vect.begin(),
[] (MyStruct const& ms)
{
return ms.member_one;
});

完整代码如下:

#include <vector>
#include <string>
#include <algorithm>

struct MyStruct {
std::string member_one;
std::string member_two;
};

int main()
{
std::vector<MyStruct> my_struct_vect(10);

// Initialize my_struct_vect...

std::vector<std::string> member_one_vect(my_struct_vect.size());

std::transform(
my_struct_vect.begin(), my_struct_vect.end(), member_one_vect.begin(),
[] (MyStruct const& ms)
{
return ms.member_one;
});

// Do something with member_one_vect...
}

这是一个live example .

关于c++ - 从类实例 vector 中提取类成员(作为新 vector ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17144953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com