有没有办法在 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)
我还没有找到,但也许还有办法做到这一点。是否有快捷方式从两个范围初始化地图,或者至少将两个范围插入地图?
您可以使用 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。