将成员从 vector<Class> 复制到 vector 的最佳方法<Member_Type> [已关闭]

Best way to copy members from vector<Class> to vector<Member_Type> [closed]

提问人:infinitezero 提问时间:6/27/2022 最后编辑:JeJoinfinitezero 更新时间:6/27/2022 访问量:112

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来用事实和引文来回答。

去年关闭。

我有一个复杂结构的向量(这里)。我现在想将一个成员(比如)复制到一个新的向量中。有没有比更好(更惯用)的方法std::pair<int, int>std::pair::first

std::vector<std::pair<int, int>> list = {{1,2},{2,4},{3,6}};

std::vector<int> x_values;
x_values.reserve(list.size());
for( auto const& elem : list )
{
    x_values.emplace_back(elem.first);
}
C++ 算法 复制 stdvector +-标准库 c +20

评论


答:

6赞 Ted Lyngmo 6/27/2022 #1

std::transform 通常用于以下方面:

#include <algorithm>  // transform
#include <iterator>   // back_inserter

// ...

std::vector<int> x_values;
x_values.reserve(list.size());

std::transform(list.cbegin(), list.cend(), std::back_inserter(x_values),
               [](const auto& pair) { return pair.first; });

评论

2赞 infinitezero 6/27/2022
太好了,正是我所想的!
1赞 JeJo 6/27/2022
好了,搬家了...... ;)
1赞 Ted Lyngmo 6/27/2022
@PaulSanders 是的,那也行。添加。
1赞 Paul Sanders 6/27/2022
...并且可以在打电话之前打电话......reservestd::transform
1赞 Paul Sanders 6/28/2022
@TedLyngmo 永远不要解释,永远不要道歉:)
4赞 JeJo 6/27/2022 #2

中使用 std::ranges::views::transform 和 range 算法,可以执行

#include <ranges>    // std::views::transform
#include <algorithm> // std::ranges::copy

std::vector<int> x_values;
x_values.reserve(list.size());

std::ranges::copy(std::views::transform(list, [](const auto& pair) {
    return pair.first; }), std::back_inserter(x_values));

或者可能是对 pair.first 的公正视图(如果缩进具有只读范围)

#include <ranges>    // std::views::transform

const auto x_values_view = std::views::transform(list, [](const auto& pair) {
        return pair.first; }
);

现场演示

评论

0赞 Paul Sanders 6/27/2022
就像第二个产品一样,对第一个产品不太确定(对我来说似乎比泰德的答案更复杂)。
0赞 JeJo 6/28/2022
@PaulSanders 我同意;但是,只是为未来的读者添加替代方案。