C++中能否通过两个范围构造map?有无便捷实现方式?
两个范围构造/插入std::map的方案
标准C++的std::map没有直接接收两个独立范围(一个存key、一个存value)的构造函数或insert重载。它的构造函数和insert方法仅接受单个范围,且该范围的元素必须是std::pair<const Key, T>(或可隐式转换为该类型的对象)。
不过可以通过以下几种方式实现类似需求:
C++20及以上版本(推荐)
利用C++20引入的std::views::zip,可以将两个范围的元素一一配对,直接传入std::map的构造函数或insert方法:
构造map
#include <map> #include <vector> #include <ranges> int main() { std::vector<int> Vector_1 = {1, 2, 3, 4}; std::vector<std::string> Vector_2 = {"one", "two", "three", "four"}; // 用zip视图直接构造map std::map<int, std::string> mymap(std::views::zip(Vector_1, Vector_2)); }
向已有map插入
// 假设mymap已存在 mymap.insert(std::views::zip(Vector_1, Vector_2));
注意:如果两个向量长度不一致,
std::views::zip会以较短的那个范围为准,自动截断多余元素。
C++20之前的版本
可以通过std::transform将两个范围的元素转换为std::pair的集合,再用这个集合构造或插入map:
构造map
#include <map> #include <vector> #include <algorithm> #include <utility> int main() { std::vector<int> Vector_1 = {1, 2, 3, 4}; std::vector<std::string> Vector_2 = {"one", "two", "three", "four"}; std::vector<std::pair<int, std::string>> key_value_pairs; // 预先分配内存提升效率 key_value_pairs.reserve(std::min(Vector_1.size(), Vector_2.size())); // 将两个向量的元素配对存入pair集合 std::transform(Vector_1.begin(), Vector_1.begin() + std::min(Vector_1.size(), Vector_2.size()), Vector_2.begin(), std::back_inserter(key_value_pairs), [](int key, const std::string& value) { return std::make_pair(key, value); }); // 用pair集合构造map std::map<int, std::string> mymap(key_value_pairs.begin(), key_value_pairs.end()); }
向已有map插入
直接将key_value_pairs的范围传入insert即可:
mymap.insert(key_value_pairs.begin(), key_value_pairs.end());
内容的提问来源于stack exchange,提问作者Kaiyakha
相关产品推荐
相关产品推荐

