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

Sla*_*ica 5 c++ stl c++11

假设我们已经std::set<int>并且我们想要创建一个std::vector<int>包含该集合的所有值:

std::set<int> set;
std::vector<int> vec( set.begin(), set.end() );
Run Code Online (Sandbox Code Playgroud)

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

Max*_*kin 6

使用变换迭代器:

#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));
}
Run Code Online (Sandbox Code Playgroud)

或者,使用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());
}
Run Code Online (Sandbox Code Playgroud)

或者与上面相同:

    auto v = boost::copy_range<std::vector<double> >(boost::adaptors::values(m));
Run Code Online (Sandbox Code Playgroud)

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