c++ - 使用迭代器按谓词重新排列

标签 c++ algorithm sorting iterator

在具有给定签名的函数中,我想以这种方式重新排列序列 [first, last) 的元素,即所有满足谓词的元素都放置在不满足谓词的元素之前,并将迭代器返回到第一个不满足谓词的元素t 满足给定谓词。

我的算法是

  • 开始迭代序列
  • 如果当前元素不满足谓词,则将其替换为最后一个
  • 再次检查同一位置的新元素是否满足
  • 如果不是,请将其替换为 (last-1),如果是,则继续下一步
  • 重复此操作,直到到达已替换的元素之一

我的代码

template<class Iterator, class Predicate>
Iterator Rearrange(Iterator first, Iterator last, Predicate pred) {
  auto res = first;
  if (first == last) {
    ;
  }
  else {
    auto run = first;
    auto end = last;
    auto tmp = *first;
    while (run != end) {
      if (pred(*run) == false) {
      again: tmp = *(--end);
    *end = *run;
    *run = tmp;
    if (pred(*run) == false) {
      goto again;
    }
      }
      ++run;
    }
  }
  return res;
}

它给了我

terminate called after throwing an instance of 'std::range_error'
  what():  dereferencing end of sequence
Aborted

我无法找到和理解。也就是说,我可以在某个地方读到我试图取消引用容器外部的元素,但在我的程序中看不到它。任何人都可以帮助我修复编码错误或改进算法的逻辑吗?

最佳答案

如果输入范围非空并且其中没有元素满足谓词,则您的代码将陷入 goto 循环中,并且不会再次到达 while。最终,--end将在first之前采取end

如果这是一个学习练习,我建议你去掉goto;您不想学习不好的做法,虽然 goto 可以有罕见的合法用途,但替换循环不是其中之一。此外,与 tmp 的舞蹈可以替换为 std::swap

如果这不是学习练习,只需使用 std::partition这正是你想要的。

关于c++ - 使用迭代器按谓词重新排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674584/

相关文章:

c++ - 为迭代器实现泛型方法的正确方法

algorithm - 经济模拟的最佳匹配算法?

algorithm - 检索和存储路线图数据

php - Dijkstra 算法 - 如何计算距离?

java - 为什么在 Java 1.8 中这样排序

c++ - 将 boost 编译为通用库(Intel 和 Apple Silicon 架构)

c++ - 使用类包装器对对象进行线程安全访问是否符合 C++11?

c++ - 插入排序 > 通过引用传递的数组中不可变值的问题

r - 如何获得数据框中每个组的 10 个最高值?

java - 两个数的安全平均值的解释