Почему я не могу использовать boost :: adapter :: map_values ​​вне цикла на основе диапазона?

Я хочу использовать буст 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::copy), никогда в операторах, которым требуются пары итераторов, например std::vectorконструктор.

Согласно GCC, проблема здесь в том, что она не применима к. Однако это буквально единственный пример, приведенный в документации , поэтому я почти уверен, что std::map<int, int> должно быть хорошо для map_values.

Что здесь не так?

PS: Я знаю, что существует миллиард других способов элегантного построения вектора из значений карты. Я хочу знать, почему этот код не работает. Кроме того, этот подход имеет дополнительное преимущество в виде гарантированного RVO вместо «вероятно NRVO», которое есть у большинства других решений, о которых я могу думать.

1 ответ

Решение

Я не знаком с диапазонами, но это может быть ответ, поэтому я отправляю его как ответ.

Вверху пишут :

      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 
Другие вопросы по тегам