【问题标题】:set insert iterator is outside range设置插入迭代器超出范围
【发布时间】:2021-01-23 10:01:50
【问题描述】:

当我在下面运行这段代码时,我的程序崩溃了:

    std::set<int> m_set = {1, 2, 3, 4, 5 };
    
    std::set<int>::iterator setIt = m_set.begin();
    
    ++setIt;

    m_set.erase(setIt);

    m_set.insert(setIt, 25);

我有一个 std::set,它由对象 Point 填充。代码编译成功,但在m_set.insert(setIt, 25) 处崩溃。我应该怎么做才能修复它?谢谢!

【问题讨论】:

  • 请在问题中包含minimal reproducible examplePoint 是什么?
  • 删除后迭代器失效。你期望会发生什么?据我所知,提示(第一个参数)不是必需的,并不总是有用的。
  • btw "stl" 用于(错误地)引用 c++ 标准库或实际的 STL。标签说明很清楚,标签是给STL的,不是给标准库的。
  • ot:好吧,在阅读了完整的标签描述之后,我不确定该标签是否应该用于 c++ 标准库。恕我直言,这取决于应归功于谁并调用标准库 stl,而忽略了它的来源
  • @idclev463035818,有一个标签std。我想它比stl 标签更适合此类问题。

标签: c++ stl std


【解决方案1】:

根据您的评论,我认为您对std::set 有一点误解。我认为您正在尝试像在 std::vectorstd::array 中那样替换元素。

但是一个集合是一个排序的集合,你不能只取出一个元素然后把另一个元素放在完全相同的位置,因为它很可能不会被排序。 p>

当您插入任何内容时,需要找到新元素的正确位置。 set.insert 的第一个参数可以在这里提供帮助。这是从哪里开始搜索这个正确位置的提示。

但这只是一个提示,它不会以任何方式影响元素的最终位置。给出一个“好”的提示可以加快插入,给出一个“坏”的提示可以减慢插入速度,但无论如何元素最终都会在相同的位置。

另一个问题是,erase 将使迭代器无效,即以后不允许您使用此迭代器。

随便用

m_set.insert(25);

元素将被放置在正确的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多