假设我有一个vector<int> myVec;
,并且我想将其转换为一组,我可以有一个衬里-
set<int> mySet(myVec.begin(), myVec.end());
这是很容易找到的东西。
现在我有vector<pair<int, int>>
,并且我想获得每个对中第二个值的集合。我应该如何使用集合构造函数来实现这一目标?有可能吗?
假设我有C ++ 11,C ++ 14,C ++ 17。
此外,如果能获得有关如何对不同容器进行一般性的类似调整的信息,我将不胜感激。
答案 0 :(得分:16)
在这种情况下寻求单缸运输不可避免地导致了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提出对评论的改进。
答案 1 :(得分:6)
这几乎一个衬里应该为您工作:
#include <algorithm>
#include <iterator>
#include <iostream>
#include <set>
#include <utility>
#include <vector>
int main()
{
std::vector<std::pair<int, int>> myVec = { {1, 2}, {3, 4} };
std::set<int> mySet;
std::transform(myVec.begin(), myVec.end(), std::inserter(mySet, mySet.begin()),
[](const std::pair<int, int>& elem) { return elem.second; });
for (int value : mySet)
{
std::cout << value << std::endl;
}
return 0;
}
输出:
2
4
答案 2 :(得分:5)
执行此操作的最C ++ y方法可能是定义一个仅生成第二个值的自定义迭代器类型。
对于更常见的查询,您可以使用非常相似的代码,即从地图中获取值:Re-render Tweet button via JS
或者,您知道,只需编写一个循环即可。没关系。