我有一个复杂结构的向量(这里是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);
}
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; });
在使用std::ranges::views::transform
和范围算法的c++20中,可以执行
#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));
or可以是对该对的一个视图。首先(如果缩进具有只读范围)
#include <ranges> // std::views::transform
const auto x_values_view = std::views::transform(list, [](const auto& pair) {
return pair.first; }
);
现场演示