【问题标题】:Store iterator inside a struct将迭代器存储在结构中
【发布时间】:2022-06-30 06:51:04
【问题描述】:

我需要从多个 JSON 文件中读取数据。数据的实际读取是在代码中稍后执行的,在一些初始化的东西之后。由于超出此问题范围的原因,我相信我的应用程序将一个迭代器存储在某个地方是有益的,该迭代器设置为每个 JSON 文件的第一个元素。这样,我就可以在以后遍历每个 JSON 文件并从每个文件中读取第 i 个元素。

问题:如果我创建迭代器并使用它立即解析数据,一切正常。 如果我创建迭代器,将其存储在结构中并稍后使用,我会遇到读取访问冲突。

以下是一些代码,可以更好地解释我的问题。首先,这里是包含单个 JSON 文件信息的结构的部分声明:

typedef struct _struct
{
  ...
  boost::property_tree::ptree json_struct;
  boost::property_tree::ptree::iterator it;
  ...
} json_handler;

仅供参考,稍后,我声明一个用于容纳多个处理程序的容器:

std::map<std::string, json_handler> mjh;

以下作品:

json_handler cms;
boost::property_tree::read_json(full_path, cms.json_struct);
boost::property_tree::ptree &data = cms.json_struct.get_child("frames");
// current_msg.it = data.begin();

// If I do iterate over the json content here, everything works.
for (boost::property_tree::ptree::iterator element = data.begin(); element != data.end(); element++)
  double time = element->second.get<double>("ST");

// The following line just inserts the current json_handler inside the map
mjh.insert(std::pair<std::string,json_handler>(name, cms));

以下操作无效:

... This is later in the code when it's time to use the data

std::map<std::string, json_handler>::iterator it;

for (it = mjh.begin(); it != mjh.end(); it++)
{
  double _st = it->second.it->second.get<double>("ST");
  std::cout << "ST: " << std::to_string(_st ) << std::endl;
  ...
}

问题:我可以将迭代器存储在结构中吗?如果不是,为什么?

【问题讨论】:

  • 我猜一些保存迭代器的变量已经被破坏或者“文件流”不再打开。因此迭代器无效
  • 您可以将迭代器存储在结构中。您可以使用任何迭代器,直到它失效为止。
  • 当您在地图中插入cms 时,它就是一个副本。原始的(您的迭代器指向的那个)大概在超出范围后被销毁。我只能猜测,因为您确实没有显示足够的代码。
  • @paddy 我相信你是对的。我已经完成了一些调试会话,确实,我可以说你是对的。现在,我只需要想办法解决它……
  • 嗯,第二个问题是您甚至没有首先存储迭代器......无论如何,不​​在您显示的代码中。所以这也可能是一个问题。至于复制问题,您可以先添加到地图中,然后获取对存储在地图中的对象的引用,以便填充它:例如 auto result = mjh.emplace(name, {}); json_handler&amp; cms = result.first-&gt;second;

标签: c++ json boost


【解决方案1】:

您正在存储迭代器,但在它们失效后使用它们。

失效的原因是相应的 ptree 节点被移动、被擦除或破坏。

只需将 ptree 存储在结构中,这样可以确保 ptree 的生命周期足够长。当然,您仍然需要确保迭代器指向的节点不会从 ptree 中删除。

附带说明,不要使用属性树进行 JSON 解析。它有严重的局限性。改用 Boost JSON:https://www.boost.org/doc/libs/1_79_0/libs/json/doc/html/index.html

它可以正确理解 JSON,速度更快,界面更友好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    相关资源
    最近更新 更多