如何从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)
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)
该类std::vector
有两个相关的构造函数:
vector(std::initializer_list<T>)
[C++11]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 行版本可能会更容易。