首页 > 解决方案 > 一种用于插入类对象的某些特定值的衬垫

问题描述

假设我有一个vector<int> myVec;并且我想将它转换为一个集合,我可以有一个衬里-

set<int> mySet(myVec.begin(), myVec.end());

这是很容易找到的。

现在我有了vector<pair<int, int>>,并且我想获得每对中的第二个值的集合。我应该如何使用集合构造函数来实现这一点?可能吗?

假设我有 C++11、C++14、C++17。

另外,如果我能获得一些关于如何对不同容器进行一般意义上的类似调整的信息,我将不胜感激。

标签: c++setc++14stdc++17

解决方案


在这种情况下要求单线不可避免地会导致使用range-v3的解决方案:

#include <range/v3/view/map.hpp>

const std::vector<std::pair<int, int>> myVec{{1, 10}, {2, 20} , {3, 30}};
const std::set<int> mySet = myVec | ranges::view::values;

以及使用Boost range ¹的类似方法:

#include <boost/range/adaptor/map.hpp>

using boost::adaptors::map_values;
const auto mySet = boost::copy_range<std::set<int>>(myVec | map_values); 

但是,您可能认为这种方法最简单(不需要库,但需要 C++17):

for (const auto& [first, second] : myVec)
    mySet.insert(second);

¹ 感谢@Caleth 建议改进评论。


推荐阅读