gpt4 book ai didi

c++ - std::map 到 std::list 导致 SIGSEGV

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:47 25 4
gpt4 key购买 nike

我想在将 std::map 转换为 std::list 时节省 RAM。因此我必须删除中间的每个元素。但是我得到了一个 SIGSEGV。

template <class U>
auto ConvertFlatSegmentsMapToList(std::map<std::string /* relative_path */, U>& differences_map, std::list<U>& differences_list) -> void {
for (auto& i:differences_map) {
differences_list.push_back(i.second);
// differences_map.erase(i.first);//TODO: SIGSEGV
}
}

怎么做?

最佳答案

如果你想节省内存,不要使用std::map,也不要使用std::list - 使用std::vector;或者更好 - 不要使用单独的字符串,应用重复数据删除等。

话虽如此,然后回答您的问题:从 map 中删除元素 invalidates iterators进入 map - 范围循环实际上是基于迭代器的。所以 - 你不能在你的循环中删除。在循环之后使用 differences_map.clear()。您还应注意,与清除整个 map 相比,删除单个元素的时间成本要高得多。

如果你的内存力如此有限,以至于你不能同时拥有完整的 map 和完整的列表,那么你只是在使用错误的数据结构——因为,就像我说的,这两者都相当浪费。尽管如此,如果你坚持,你可以重复插入 *differences_map.begin() 到列表中,然后从 map 中删除它(并且每次都再次获取 .begin() ,在迭代器失效之后)。

关于c++ - std::map 到 std::list 导致 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50698705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com