c – 使用不同类型的容器的迭代器范围初始化容器

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

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

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

最佳答案
使用变换迭代器:

#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 :: adapters:

#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));

请注意,使用vector的范围构造函数比涉及back_inserter的解决方案更有效.

转载注明原文:c – 使用不同类型的容器的迭代器范围初始化容器 - 代码日志