在C++和range-v3中,如何首先转换视图,然后将其转换为Map?

6uxekuva  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(115)

有任何范围作为输入,如何首先将其元素转换为元组,然后将它们保存在std::mapranges::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,范围是当前主程序。

a1o7rhls

a1o7rhls1#

你需要一个std::pair,而不是一个std::tupleworking example):

auto m = ranges::views::iota(3, 10)
       | ranges::views::transform([](auto const &v){ return std::make_pair(v, v*2); })
       | ranges::to<std::map>;

毕竟,虽然这样的事情是好的,

std::vector<std::pair<int, int>> v;
std::map<int,int> M(v.begin(), v.end());

像这样的事情

std::vector<std::tuple<int, int>> v;
std::map<int,int> M(v.begin(), v.end());

或者,更简单地说,就像评论中建议的那样,

std::map<int,int> P{{std::pair<int, int>{}}};  // OK
std::map<int,int> T{{std::tuple<int, int>{}}}; // Error

相关问题