C++ 构造一个具有两个范围的映射

Kai*_*kha 0 c++ stdmap

有没有办法在 C++ 中构造具有两个范围的映射?也就是说,不是调用默认构造函数并随后将元素插入到映射中:

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

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

std::map<t1, t2> mymap(Vector_1.begin(), Vector_1.end(), Vector_2.begin(), Vector_2.end());
Run Code Online (Sandbox Code Playgroud)

或者:

mymap.insert(Vector_1.begin(), Vector_1.end(), Vector_2.begin(), Vector_2.end());
Run Code Online (Sandbox Code Playgroud)

我还没有找到,但也许还有办法做到这一点。是否有快捷方式从两个范围初始化地图,或者至少将两个范围插入地图?

rtu*_*ado 5

您可以使用 Eric Niebler 的 range-v3 库,将两个向量压缩到视图中,然后将该视图写入地图。

[演示]

#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}
Run Code Online (Sandbox Code Playgroud)

正如 Armin Montigny 所言,std::ranges::views::zip直到 C++23 才可用;同样的情况也发生在std::ranges::to. 在这里您可以看到一些编译器已经实现std::ranges::views::zip但尚未实现std::ranges::to