提问人:infinitezero 提问时间:6/27/2022 最后编辑:JeJoinfinitezero 更新时间:6/27/2022 访问量:112
将成员从 vector<Class> 复制到 vector 的最佳方法<Member_Type> [已关闭]
Best way to copy members from vector<Class> to vector<Member_Type> [closed]
问:
我有一个复杂结构的向量(这里)。我现在想将一个成员(比如)复制到一个新的向量中。有没有比更好(更惯用)的方法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);
}
答:
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
...并且可以在打电话之前打电话......reserve
std::transform
1赞
Paul Sanders
6/28/2022
@TedLyngmo 永远不要解释,永远不要道歉:)
4赞
JeJo
6/27/2022
#2
在 c++20 中使用 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 我同意;但是,只是为未来的读者添加替代方案。
评论