关于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设置所有面+角度对 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>>,然后你可以直接往里面加数据,非常方便。批量解析导入数据
如果你是从文件或输入流读取数据(比如你给出的每行格式:顶点号 面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(); }
三、访问容器中的可变长列(面+角度列表)
要访问每个顶点对应的可变长面和角度数据,有两种常用方式:
通过顶点号(键)直接访问
如果你知道要访问的顶点号,建议先检查键是否存在,避免误创建空元素: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) { // 处理每个面和角度 }迭代整个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) vsmap的O(log n))。 - 操作vector时尽量用引用(
auto&),避免不必要的数据拷贝,提升性能。 - 如果不想让
polyMap[key]自动创建空元素,就用find()检查键是否存在,不要直接用[]访问不存在的键。
内容的提问来源于stack exchange,提问作者user9267359
相关产品推荐
相关产品推荐

