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

如何将std::map拆分为固定长度小map存入std::vector并解决编译报错

std::map固定长度拆分问题修复方案

问题根源

原代码的核心错误是迭代器偏移逻辑错误:std::advance是在迭代器当前位置的基础上累加偏移量,而你每次循环传入的last是从容器起始位置计算的总偏移量,多次累加后直接导致迭代器越界,触发非法访问。

修正后可运行代码

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>

int main(){
    using namespace std::string_literals;

    auto code = std::map<std::string, std::string>{
        {"Red"s, "Red"s},
        {"Blue"s, "Blue"s},
        {"Green"s, "Green"s},
        {"Fuchsia"s, "Fuchsia"s},
        {"Mauve"s, "Mauve"s},
        { "Gamboge"s, "Gamboge"s },
        {"Vermillion"s, "Vermillion"s}
    };
    
    const size_t group_size = 2; // 固定分组长度,可灵活修改
    std::vector<std::map<std::string,std::string>> subsetCode;
    auto current = code.begin();
    
    while (current != code.end()) {
        // 计算当前分组的结束迭代器,最多走到容器末尾
        auto group_end = current;
        size_t remaining = std::distance(current, code.end());
        size_t step = std::min(group_size, remaining);
        std::advance(group_end, step);
        
        // 移动构造分组map,插入结果容器
        subsetCode.emplace_back(std::make_move_iterator(current),
                               std::make_move_iterator(group_end));
        
        // 移动当前迭代器到下一组的起始位置
        current = group_end;
    }
    
    // 输出验证结果
    for (size_t i = 0; i < subsetCode.size(); i++) {
        std::cout << "第" << i+1 << "组: ";
        for (const auto& [key, value]: subsetCode[i]){
            std::cout << key << ":" << value << " ";
        }
        std::cout << "\n";
    }

    return 0;
}

优化说明

  • 改用while循环判断迭代器是否走到末尾,避免手动计算索引出错
  • 每次分组都从当前迭代器位置计算结束位置,不会出现越界问题
  • 拆分用std::map的区间构造+移动迭代器,保证拆分效率和通用拆包方案一致
  • 分组长度抽为常量,可灵活调整为任意固定长度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:45:03