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

如何在pair首键变化时确定符合条件的map对应vector大小

解决方法:按首元素分组筛选并生成对应vector

我来帮你搞定这个问题!你的需求核心是按pair的首元素分组,筛选出每组中值大于2的元素,计算对应的浮点数后存入大小匹配的vector里。刚好map<pair<int,int>, int>是有序容器,同一首元素的键会连续排列,这给分组带来了很大便利。

实现思路

  1. 利用map的有序性:pair<int,int>的排序规则是先比较第一个int,再比较第二个,所以同一首元素的条目会连续出现在遍历过程中。
  2. 跟踪当前分组的首元素:遍历过程中记录当前处理的首元素,当遇到新的首元素时,将上一组的结果保存,然后开始新的分组。
  3. 筛选并计算:对每个条目,判断值是否大于2,符合条件则计算对应的浮点数,存入临时vector。
  4. 处理最后一组:遍历结束后,不要忘记把最后一组的临时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:24:41