使用不同类型的容器的迭代器范围初始化容器 [英] Initialize a container with iterator range of container with different type

查看:113
本文介绍了使用不同类型的容器的迭代器范围初始化容器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我们有 std :: set< int> ,我们想创建一个 std :: vector< int> 以及该集合中的所有值:

Let's say we have std::set<int> and we want to create a std::vector<int> with all values from that set:

std::set<int> set;
std::vector<int> vec( set.begin(), set.end() );

这简单而优雅。但是,假设我有一个 std :: map< std :: string,int> ,并且我想将所有值复制到 std :: vector< int> 。不幸的是,没有构造函数可以接受迭代器和转换器函数的范围。为什么没有提供这样的构造函数?还有另一种简单而优雅的方法来初始化具有不同类型值的一个容器吗?

This is simple and elegant. But let's say I have a std::map<std::string,int> and I want to copy all values to std::vector<int>. Unfortunately there is no constructor, that accepts range of iterators and converter function. Why there is no such constructor provided? Is there another simple and elegant way to initialize one container with different type values?

推荐答案

使用转换迭代器:

#include <boost/iterator/transform_iterator.hpp>
#include <vector>
#include <map>

int main() {
    std::map<int, double> m;
    auto f = [](auto&& pair) { return pair.second; };
    std::vector<double>(boost::make_transform_iterator(m.begin(), f),
                        boost::make_transform_iterator(m.end(), f));
}

或者,使用boost :: adaptors:

Alternatively, use boost::adaptors:

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

int main() {
    std::map<int, double> m;
    auto range = boost::adaptors::values(m);
    std::vector<double>(range.begin(), range.end());
}

或与以上相同:

    auto v = boost::copy_range<std::vector<double> >(boost::adaptors::values(m));

请注意,使用向量的范围构造函数比涉及 back_inserter

Note that using vector's range constructor is more efficient than a solution involving back_inserter.

这篇关于使用不同类型的容器的迭代器范围初始化容器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆