一种用于插入类对象的某些特定值的衬里

时间:2018-09-25 12:58:52

标签: c++ set c++14 std c++17

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

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

这是很容易找到的东西。

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

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

此外,如果能获得有关如何对不同容器进行一般性的类似调整的信息,我将不胜感激。

3 个答案:

答案 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

或者,您知道,只需编写一个循环即可。没关系。