C++构造具有两个范围的Map

vuktfyat  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(125)

在C++中有没有一种方法可以构造一个有两个区域的Map?也就是说,不用调用默认的构造函数,然后在Map中插入元素:

for (size_t i = 0; i < Vector_1.size() && i < Vector_2.size(); i++) {
    mymap[Vector_1[i]] = Vector_2[i];
}

我想通过调用某种构造函数来构建一个Map,该构造函数将两个范围作为参数,如下所示:

std::map<t1, t2> mymap(Vector_1.begin(), Vector_1.end(), Vector_2.begin(), Vector_2.end());

或者:

mymap.insert(Vector_1.begin(), Vector_1.end(), Vector_2.begin(), Vector_2.end());

我还没有找到,但也许还有一种方法可以做到这一点。有没有一种快捷方式可以从两个范围初始化Map,或者至少在Map中插入两个范围?

p4tfgftt

p4tfgftt1#

您可以使用Eric Niebler的range-v3库,将两个向量压缩到一个视图中,然后将该视图写入Map。
Demo(https://godbolt.org/z/ejTbvGz99)

#include <fmt/ranges.h>
#include <map>
#include <range/v3/all.hpp>
#include <vector>

int main() {
    std::vector<char> cs{'a', 'b', 'c'};
    std::vector<int> is{1, 2, 3};
    auto m{ ranges::views::zip(cs, is) | ranges::to<std::map<char, int>>() };
    fmt::print("{}", m);
}

// Outputs: {'a': 1, 'b': 2, 'c': 3}

正如Armin Montigny所指出的,std::ranges::views::zip要到C++23才可用;同样的情况也发生在std::ranges::to上。Here您可以看到一些编译器已经实现了std::ranges::views::zip,但还没有实现std::ranges::to

vaqhlq81

vaqhlq812#

  • 是否有快捷方式从两个范围初始化Map,或至少将两个范围插入到Map中?*

创建自己的“快捷方式”是很简单的,它通常采用自由函数的形式。

#include <cassert>
#include <vector>
#include <list>
#include <map>
#include <ranges>
#include <iostream>

template <std::ranges::range K, std::ranges::range V>
std::map<std::ranges::range_value_t<K>, std::ranges::range_value_t<V>> createMapFromRanges(K&& krng, V&& vrng)
{
    std::map<std::ranges::range_value_t<K>, std::ranges::range_value_t<V>> map;
    assert(std::size(krng) == std::size(vrng));
    auto [k, kend] = std::tuple{krng.begin(), krng.end()};
    auto [v, vend] = std::tuple{vrng.begin(), vrng.end()};
    while (k != kend && v != vend)
        map.emplace(*k++,*v++);
    return map;
}
    
int main()
{
    auto map = createMapFromRanges(std::vector<int>{1,2,3}, std::list<int>{4,5,6});
    for (auto& elem : map) {
        std::cout << elem.first << '/' << elem.second << '\n';
    }
    return 0;
}

P.S.我看到很多帖子引用了其他库(例如boostrange-v3)或不支持的特性(例如zip_view)。当然,我赞成重用高质量的库。不幸的是,许多项目根本无法使用它们(即受组织限制)。

相关问题