我想使用boost的boost::adaptor::map_values
来构造一个std::map
的所有值的向量。举个例子代码(或者在Godbolt上试试(:
#include <boost/range/adaptors.hpp>
#include <boost/range/adaptor/map.hpp>
std::vector<int> getValueVector(const std::map<int, int> & m)
{
auto valueRange = boost::adaptors::map_values(m);
return std::vector<int>(valueRange.begin(), valueRange.end());
}
int main() {
std::map<int, int> my_map;
getValueVector(my_map);
}
GCC投诉:
error: no match for call to '(const boost::range_detail::map_values_forwarder) (const std::map<int, int>&)'
我能找到的所有示例和所有文档都只在接受范围的语句中使用boost适配器(如基于范围的循环或boost::copy
(,而从不在需要迭代器对的语句中(如std::vector
的构造函数(使用。
根据GCC,这里的问题是map_values
不适用于std::map<int, int>
。然而,这实际上是文档中给出的唯一示例,所以我非常确信std::map<int, int>
应该适用于map_values
。
这里哪里不对劲?
附言:我知道还有很多其他方法可以从地图的值优雅地构建向量。我想知道为什么这个代码不起作用。而且,这种方法具有保证RVO而不是"保证RVO"的附加优点;可能是NRVO";,我能想到的大多数其他解决方案都有。
我不熟悉范围,但这可能是一个答案,所以我将其作为答案发布。
在顶部,他们写道:
Syntax Code
Pipe rng | boost::adaptors::map_values
Function boost::adaptors::values(rng)
事实上,当我把你的代码改成这样时:
#include <boost/range/adaptors.hpp>
#include <boost/range/adaptor/map.hpp>
#include <iostream>
std::vector<int> getValueVector(const std::map<int, int> & m)
{
auto valueRange = boost::adaptors::values(m);
return std::vector<int>(valueRange.begin(), valueRange.end());
}
int main() {
std::map<int, int> my_map{{1,2},{3,4},{5,6}};
auto v = getValueVector(my_map);
for (const auto& e : v) std::cout << e << " ";
}
有预期的输出:
2 4 6