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

标签 c++ c++11 stl

假设我们有 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::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));

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

关于c++ - 使用不同类型容器的迭代器范围初始化容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32377304/

相关文章:

c++ - Eclipse,如果程序崩溃则看不到输出

c++ - 抽象类 C++ 中的变量

c++ - 在没有原始循环的情况下累积相等的范围

python - 从 vtkActor 更新 vtkPolyData

c++ - 在不包含在另一个范围内的范围内找到第一个元素

c++ - 如何结合 boost::spirit::lex 和 boost::spirit::qi?

c++ - `string s("hello") ;` and ` string s = "hello";` 有区别吗

c++ - 具有派生类实例的工厂

c++ - if block 内的 std::lock_guard 范围

c++ - 为什么 Vector 中的 Erase 和 Insert 函数会使迭代器失效?