如何在pair首键变化时确定符合条件的map对应vector大小
解决方法:按首元素分组筛选并生成对应vector
我来帮你搞定这个问题!你的需求核心是按pair的首元素分组,筛选出每组中值大于2的元素,计算对应的浮点数后存入大小匹配的vector里。刚好map<pair<int,int>, int>是有序容器,同一首元素的键会连续排列,这给分组带来了很大便利。
实现思路
- 利用map的有序性:
pair<int,int>的排序规则是先比较第一个int,再比较第二个,所以同一首元素的条目会连续出现在遍历过程中。 - 跟踪当前分组的首元素:遍历过程中记录当前处理的首元素,当遇到新的首元素时,将上一组的结果保存,然后开始新的分组。
- 筛选并计算:对每个条目,判断值是否大于2,符合条件则计算对应的浮点数,存入临时vector。
- 处理最后一组:遍历结束后,不要忘记把最后一组的临时vector存入结果。
完整代码示例
#include <map> #include <vector> #include <utility> #include <iostream> int main() { // 示例输入的map std::map<std::pair<int, int>, int> counts = { {{1,1}, 4}, {{1,2}, 5}, {{1,3}, 5}, {{1,7}, 5}, {{1,29}, 2}, {{2,10}, 1}, {{2,20}, 4} }; std::map<int, std::vector<double>> result; // 按首元素存储对应的vector int current_first_key = -1; // 初始值设为一个不可能出现的键值 std::vector<double> current_group_vec; for (const auto& entry : counts) { const auto& key_pair = entry.first; int first_key = key_pair.first; int count_value = entry.second; // 切换分组:遇到新的首元素时,保存上一组的结果 if (first_key != current_first_key) { if (current_first_key != -1) { // 跳过初始状态 result[current_first_key] = std::move(current_group_vec); // 用move避免拷贝开销 current_group_vec.clear(); } current_first_key = first_key; } // 筛选值大于2的元素,计算浮点数并存入vector if (count_value > 2) { // 这里替换成你实际的浮点数计算逻辑,示例用count_value转成double后乘以0.5 double calculated_float = static_cast<double>(count_value) * 0.5; current_group_vec.push_back(calculated_float); } } // 处理最后一组数据 if (current_first_key != -1) { result[current_first_key] = std::move(current_group_vec); } // 测试输出结果 for (const auto& res_entry : result) { std::cout << "首元素 " << res_entry.first << " 的vector大小:" << res_entry.second.size() << "\n"; std::cout << "元素值:"; for (double val : res_entry.second) { std::cout << val << " "; } std::cout << "\n"; } return 0; }
代码解释
- 分组逻辑:通过
current_first_key跟踪当前处理的首元素,当遍历到不同的首元素时,将之前收集的current_group_vec存入result,并重置临时vector。 - 筛选与计算:判断
count_value > 2,符合条件则执行你的浮点数计算逻辑(示例中只是简单的转换和乘法,你可以替换成自己的业务逻辑)。 - 效率优化:使用
std::move转移vector的所有权,避免不必要的内存拷贝,提升性能。
示例输出
对应你给出的输入数据,运行代码后会输出:
首元素 1 的vector大小:4 元素值:2 2.5 2.5 2.5 首元素 2 的vector大小:1 元素值:2
完全符合你需求中“首元素1对应vector大小为4”的预期。
额外提示
- 如果不需要按首元素保存所有组的结果,而是要逐个处理每组的vector,可以在每次分组切换时直接处理
current_group_vec,而不用存入result容器。 - 如果浮点数计算逻辑复杂,建议单独封装成一个函数,比如
double calculate_float(const std::pair<int,int>& key, int count),让代码更清晰易维护。
内容的提问来源于stack exchange,提问作者Grillteller
相关产品推荐
相关产品推荐

