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

nlohmann::json迭代器报错invalid_iterator,如何遍历存入vector?

解决nlohmann::json对象遍历偏移量报错问题

你遇到的json.exception.invalid_iterator.209错误,核心原因是nlohmann::json的对象迭代器属于双向迭代器(类似std::map迭代器),不支持偏移量操作(比如it + n)。只有随机访问迭代器(如JSON数组迭代器、std::vector迭代器)才支持偏移操作,而JSON对象属于关联容器类型,迭代器不具备该特性。

以下是两种正确的实现方式:

方式1:范围for遍历(推荐,代码简洁)

利用j.items()获取JSON对象的键值对视图,直接遍历每个键值对:

// 假设j是你查询返回的nlohmann::json对象
std::vector<std::pair<std::string, std::vector<uint64_t>>> vec;

// C++17及以上支持结构化绑定写法
for (const auto& [key, value] : j.items()) {
    // 将JSON数组转换为vector<uint64_t>
    std::vector<uint64_t> num_list = value.get<std::vector<uint64_t>>();
    vec.emplace_back(key, num_list);
}

如果是C++11/14环境(不支持结构化绑定),改用如下写法:

for (const auto& item : j.items()) {
    std::string key = item.key();
    std::vector<uint64_t> num_list = item.value().get<std::vector<uint64_t>>();
    vec.push_back(std::make_pair(key, num_list));
}

方式2:显式迭代器遍历

如果需要手动控制迭代器(比如中途终止遍历),可以用双向迭代器的常规遍历方式:

std::vector<std::pair<std::string, std::vector<uint64_t>>> vec;

for (auto it = j.begin(); it != j.end(); ++it) {
    std::string key = it.key();
    std::vector<uint64_t> num_list = it.value().get<std::vector<uint64_t>>();
    vec.emplace_back(key, num_list);
}

注意:不要对JSON对象的迭代器使用it + 1、it += n这类偏移操作,这会触发你遇到的迭代器类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:10:45