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

关于map<unsigned int, vector<vector<unsigned int>>>容器的赋值、初始化与访问问题

当然可以用你定义的map<unsigned int, vector<vector<unsigned int>>> polyMap;来实现这个存储需求!这个结构简直是为你的场景量身定做的:用唯一顶点号作为键(unsigned int类型),每个键对应的值是一个二维vector——内层的每个小vector刚好能存「面编号+对应角度」的成对信息,完全符合你的数据逻辑。下面咱们一步步拆解怎么操作这个容器:

一、容器初始化

初始化分两种常用方式,按需选择:

  • 默认初始化:直接声明即可,此时map是空的,后续可以慢慢添加数据
    map<unsigned int, vector<vector<unsigned int>>> polyMap;
    
  • 带初始数据的初始化:如果你一开始就有已知的示例数据,可以直接在声明时填充,比如把你给出的示例数据放进去:
    map<unsigned int, vector<vector<unsigned int>>> polyMap = {
        {0, {{0, 20}, {1, 30}, {2, 40}}},  // 顶点0对应3组面+角度
        {2, {{0, 20}, {1, 30}}}             // 顶点2对应2组面+角度
    };
    
二、给容器赋值(添加/更新数据)

根据你的数据来源不同,有几种常见的赋值方式:

  1. 直接给单个顶点添加数据
    如果是手动添加某个顶点的面和角度,可以直接通过键操作:

    // 方式1:一次性给顶点1设置所有面+角度对
    polyMap[1] = {{3, 25}, {4, 35}};
    
    // 方式2:先获取顶点5对应的vector,再逐个添加
    polyMap[5].push_back({6, 45});  // 添加面6,角度45
    polyMap[5].push_back({7, 55});  // 添加面7,角度55
    

    这里要注意:如果键(顶点号)不存在,polyMap[key]会自动创建一个空的vector<vector<unsigned int>>,然后你可以直接往里面加数据,非常方便。

  2. 批量解析导入数据
    如果你是从文件或输入流读取数据(比如你给出的每行格式:顶点号 面1 角度1 面2 角度2 ...),可以这样解析赋值:

    unsigned int vertexId;
    // 假设从输入读取顶点号
    while (cin >> vertexId) {
        vector<vector<unsigned int>> faceAnglePairs;
        unsigned int face, angle;
        // 循环读取该行的面和角度对,直到行尾
        while (cin.peek() != '\n' && cin >> face >> angle) {
            faceAnglePairs.push_back({face, angle});
        }
        // 将解析好的内容赋值给map
        polyMap[vertexId] = faceAnglePairs;
        // 跳过换行符,准备读取下一行
        cin.ignore();
    }
    
三、访问容器中的可变长列(面+角度列表)

要访问每个顶点对应的可变长面和角度数据,有两种常用方式:

  1. 通过顶点号(键)直接访问
    如果你知道要访问的顶点号,建议先检查键是否存在,避免误创建空元素:

    unsigned int targetVertex = 0;
    // 用find检查键是否存在
    if (polyMap.find(targetVertex) != polyMap.end()) {
        // 用引用获取对应的面+角度列表,避免拷贝,效率更高
        auto& faceAngles = polyMap[targetVertex];
        // 遍历每个面+角度对
        for (auto& pair : faceAngles) {
            unsigned int face = pair[0];
            unsigned int angle = pair[1];
            cout << "顶点" << targetVertex << "对应的面:" << face << ",角度:" << angle << endl;
        }
    }
    

    如果你确定目标顶点号一定存在,也可以用at()方法,它会直接返回对应的值,不存在则抛出异常:

    auto& faceAngles = polyMap.at(0);
    for (auto& pair : faceAngles) {
        // 处理每个面和角度
    }
    
  2. 迭代整个map并更新数据
    如果你需要遍历所有顶点,同时更新它们的面或角度数据,直接遍历map即可,记得用引用修改原始数据:

    for (auto& entry : polyMap) {
        unsigned int vertex = entry.first;  // 获取当前顶点号(键)
        auto& faceAngles = entry.second;    // 获取对应的面+角度列表(值,引用)
        
        // 示例1:给每个顶点的最后一个角度值加10
        if (!faceAngles.empty()) {
            faceAngles.back()[1] += 10;
        }
        
        // 示例2:给顶点0新增一组面+角度数据
        if (vertex == 0) {
            faceAngles.push_back({3, 50});
        }
    }
    
四、额外小建议
  • 如果你不需要顶点号按顺序存储,建议用unordered_map<unsigned int, vector<vector<unsigned int>>>代替map,它的查找和插入效率更高(平均O(1) vs map的O(log n))。
  • 操作vector时尽量用引用(auto&),避免不必要的数据拷贝,提升性能。
  • 如果不想让polyMap[key]自动创建空元素,就用find()检查键是否存在,不要直接用[]访问不存在的键。

内容的提问来源于stack exchange,提问作者user9267359

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:15:15