c++构造具有两个范围的map



是否有一种方法可以在c++中构造一个具有两个范围的映射?也就是说,不是调用默认构造函数,然后将元素插入到映射中:

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

我想通过调用某种构造函数来建立一个映射,该构造函数可以接受两个范围作为参数,就像这样:

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());

我还没有找到,但也许还是有办法的。是否存在从两个范围初始化映射的快捷方式,或者至少在映射中插入两个范围?

您可以使用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}

正如Armin Montigny所指出的,std::ranges::views::zip直到c++ 23才可用;std::ranges::to也是如此。在这里,你可以看到一些编译器已经实现了std::ranges::views::zip,但还没有实现std::ranges::to

是否存在从两个范围初始化映射的快捷方式,或者至少在映射中插入两个范围?

创建自己的"快捷键"很简单,它通常采用自由函数的形式。

#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;
}

注:我看到许多帖子引用了其他库(例如boost,range-v3)或不支持的功能(例如zip_view)。当然,我赞成重用高质量的库。不幸的是,许多项目根本不能使用它们(即受到组织的限制)。

最新更新