为什么我不能在基于范围的循环之外使用 boost::adaptor::map_values?



我想使用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 

相关内容

  • 没有找到相关文章

最新更新