有任何范围作为输入,如何首先将其元素转换为元组,然后将它们保存在std::map
中ranges::to
?
这段代码可以工作并创建一个元组向量:
#include <range/v3/all.hpp>
#include <fmt/format.h>
#include <fmt/ranges.h>
int main() {
auto v = ranges::views::iota(3, 10)
| ranges::views::transform([](auto const &v){ return std::make_tuple(v, v*2); })
| ranges::to<std::vector>();
fmt::print("{}\n", v);
}
将vector
替换为map
,我希望收到一个map(元组的第一个元素成为键,第二个元素成为它们的值),但代码无法编译:
#include <range/v3/all.hpp>
#include <fmt/format.h>
#include <fmt/ranges.h>
int main() {
auto v = ranges::views::iota(3, 10)
| ranges::views::transform([](auto const &v){ return std::make_tuple(v, v*2); })
| ranges::to<std::map>();
fmt::print("{}\n", v);
}
我得到:test.cpp:11:10: error: invalid operands to binary expression ('invoke_result_t<ranges::views::transform_base_fn, ranges::iota_view<int, int>, (lambda at test.cpp:9:30)>' (aka 'transform_view<ranges::iota_view<int, int>, (lambda at test.cpp:9:30)>') and 'detail::to_container_fn<detail::from_range<std::map>>' (aka 'closure<ranges::detail::from_range<std::map>, ranges::detail::to_container::fn<ranges::detail::from_range<std::map>>>'))
注:我在互联网上没有找到很多使用ranges::to<map>
的例子,但在这个答案中:https://stackoverflow.com/a/74433668有一段工作代码,将ranges::views::zip
的结果转换为map。由于zip
产生“类似元组”的元素,我希望我的代码也能工作,但显然它不是那么简单。
编译器是Clang++ v. 15.0.6,范围是当前主程序。
1条答案
按热度按时间a1o7rhls1#
你需要一个
std::pair
,而不是一个std::tuple
(working example):毕竟,虽然这样的事情是好的,
像这样的事情
或者,更简单地说,就像评论中建议的那样,