是否可以从地图中的键初始化矢量?

Mr.*_*Boy 7 c++ c++11

如何从std :: map中检索所有键(或值)并将它们放入向量中?介绍了如何从地图前C++ 11中的键中填充std :: vector.

有没有办法在C++ 11中使用lambdas等来实现这一点,这意味着我们可以在一行中完成它,这样我们就可以从地图初始化向量而不是创建一个向量并在2个动作中填充它?

例如 vector<int> v(???(m.begin(),m.end()));

纯C++ 11是首选,但是可以接受提升......目的是在一行中完成此操作而不会过于复杂和"炫耀",所以它不会让其他开发人员感到困惑.

为了比较,"明显的"C++ 11解决方案是:

vector<int> v;
v.reserve(m.size()); //not always needed
for(auto &x : map)
  v.push_back(x.first)
Run Code Online (Sandbox Code Playgroud)

Aki*_*shi 5

boost::adaptor::map_keys在 Boost.Range 中使用。

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

int main()
{
    const std::map<int, std::string> m = {
        {1, "Alice"},
        {2, "Bob"},
        {3, "Carol"}
    };

    auto key_range = m | boost::adaptors::map_keys;
    const std::vector<int> v(key_range.begin(), key_range.end());

    for (int x : v) {
        std::cout << x << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
Run Code Online (Sandbox Code Playgroud)

  • `map_keys` 行为被记录在案。任何方法都需要理解。 (2认同)

ree*_*ece 0

该类std::vector有两个相关的构造函数:

  1. vector(std::initializer_list<T>)[C++11]
  2. vector(InputIterator first, InputIterator last)[C++98]

第一个是新的 C++11 构造函数,它允许您执行以下操作:

std::vector<int> v{ 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

第二个允许您执行以下操作:

std::vector<int> w{ v.rbegin(), v.rend() }; // 3, 2, 1
Run Code Online (Sandbox Code Playgroud)

我没有看到使用构造函数的方法initializer_list(因为您没有预先提供的项目),因此您最好的选择是创建一个key_iterator适用于 astd::map<T, K>::iterator并返回(*i).first而不是 的类(*i)。例如:

std::vector<int> keys{ key_iterator(m.begin()), key_iterator(m.end()) };
Run Code Online (Sandbox Code Playgroud)

这还需要您编写key_iterator类,您可以使用 Boost 迭代器适配器来简化任务。使用 2 行版本可能会更容易。