Почему я не могу использовать 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