You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:50:20