从向量 c++ 中删除对象时出现分段错误

发布于 2024-12-07 06:07:26 字数 496 浏览 0 评论 0 原文

因此,当我运行此函数时,我会出现段错误,

      class vector <Record<value> >::iterator itr = records.begin();

      for (; itr != records.end(); ++itr) {
        if (itr->isSelected()) {
          itr = records.erase(itr);
          recordSize--;
        }
      }

其中我的向量为 vector ; > Records; 函数 isSelected() 只是一个 boolean,当对象被选择时,它的值为 true;当对象未被选择时,它的值为 false。

有人可以帮助我吗,我不认为这样做有什么问题

So I am seg faulting when I run this function

      class vector <Record<value> >::iterator itr = records.begin();

      for (; itr != records.end(); ++itr) {
        if (itr->isSelected()) {
          itr = records.erase(itr);
          recordSize--;
        }
      }

where my vector is of vector <Record <value> > records; and the function isSelected() is just a boolean that is either true when the object is selected or false when its not.

Can someone help me please, I don't see the problem with doing it this way

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

別甾虛僞 2024-12-14 06:07:27

如果您要删除最后一个元素,itr 首先将是 records.end(),因为这就是 records.erase()将返回,然后您使用 ++itr 递增它。尝试:

  while (itr != records.end()) {
    if (itr->isSelected()) {
      itr = records.erase(itr);
      recordSize--;
    } else {
      ++itr;
    }
  }

In the case where you're deleting the last element, itr will first be records.end() because that's what records.erase() will return, and then you're incrementing it with ++itr. Try:

  while (itr != records.end()) {
    if (itr->isSelected()) {
      itr = records.erase(itr);
      recordSize--;
    } else {
      ++itr;
    }
  }
抚笙 2024-12-14 06:07:27

您不应该像这样删除向量元素,这不是一种有效的方法,因为您可能会在此过程中多次重新分配向量。

正确且更有效的方法是使用 std::erase 函数。请参阅此问题的示例

You shouldn't be erasing vector elements like that, it is not an efficient method as you may cause the reallocation of the vector several times during the process.

The correct and more efficient way of doing this is to use the std::erase function. See this question for examples.

与风相奔跑 2024-12-14 06:07:27

如果 itr 在主体中没有被修改,则 for (; itr !=records.end(); ++itr) 保证不会转义容器并调用 UB循环,或者如果它被递减。

在这里,您正在推进迭代器:itr = Records.erase(itr);

当你这样做时,你不仅会跳过一个元素,还可能会跳过最后一位假想的“元素”,你可以递增超过最后一位(布)。

for (; itr != records.end(); ++itr) is guaranteed not to escape the container and invoke UB if itr is not modified in the body of the loop, or if it is decremented.

Here you are advancing the iterator: itr = records.erase(itr);.

When you do so, no only you are skipping an element, also you may skip the one-past-the-end imaginary "element", IOW you may increment past one-past-the-end (UB).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文