0

我想使用 boost'sboost::adaptor::map_values来构造 a 的所有值的向量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);
}

海合会抱怨:

error: no match for call to '(const boost::range_detail::map_values_forwarder) (const std::map<int, int>&)'

我能找到的所有示例和所有文档都只在接受范围的语句(如基于范围的 for 循环或 )中使用 boost 适配器,而不是在需要像构造boost::copy函数这样的迭代器对的语句中。std::vector

根据 GCC,这里的问题map_values是不适用于std::map<int, int>. 但是,这实际上是 docs 给出的唯一示例,所以我很确定这std::map<int, int>对于map_values.

这里有什么问题?

PS:我知道有无数其他方法可以从地图的值中优雅地构造一个向量。我想知道为什么这段代码不起作用。此外,这种方法具有保证 RVO 的额外好处,而不是“可能是 NRVO”,这是我能想到的大多数其他解决方案。

4

1 回答 1

2

我不熟悉范围,但这可能是一个答案,所以我将其发布为答案。

他们在顶部写道

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 
于 2021-04-27T09:36:19.193 回答