在c++中跟随迭代器导致返回[closed]时出现分段错误

vwkv1x7d  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(110)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
昨天关门了。
Improve this question
我正在做一个算法问题,“将元素移到末尾”,我得到一个元素数组,一个目标值,我需要将所有与这个目标值相同的值移到数组的末尾,

#include <vector>

using namespace std;

vector<int> moveElementToEnd(vector<int> array, const int toMove) {
  // Write your code here.
  auto left = array.begin();
  auto right = array.end() -1;

  while(left < right){
    if (left == right) {
      break;
    }
    if (left >= array.end()) {
      break;
    }
    if (right < array.begin()) {
      break;
    }
    if(*right == toMove){
      --right;
    }
    if(*right != toMove && *left == toMove){
      iter_swap(right, left);
      --right;
    }
    if(*right != toMove && *left!=toMove){
      ++left;
    }
  }
  // bug here
  // cout << "left: " << *left << "right: "<< *right  << endl; 
  return array;
}

如果我取消对该行的注解,那么在这个while循环中不会发生分段

cout << "left: " << *left << "right: "<< *right  << endl;

分割错误抛出,但如果我不这样做,一切正常工作,这真的很奇怪,因为左右永远不会移出边界,我检查了输出,
我以前也试过别的方法

vector<int> moveElementToEnd(vector<int> array, const int toMove) {
  // Write your code here.
  auto left = array.begin();
  auto right = array.end() -1;

  while(left < right){
    // if (left == right) {
    //   break;
    // }
    // if (left >= array.end()) {
    //   break;
    // }
    // if (right < array.begin()) {
    //   break;
    // }
    if(*right == toMove){
      --right;
    }
    if(*right != toMove && *left == toMove){
      iter_swap(right, left);
      --right;
    }
    if(*right != toMove && *left!=toMove){
      ++left;
    }
  }
  // seg fault occurs here
  return array;
}

这是我的原始版本,因为左右永远不会超出范围,这是我正在尝试的数据[2,1,2,2,2,3,4,2]
并且分段故障正好发生在返回之前

j2datikz

j2datikz1#

这里

if (left >= array.end()) {
  break;
}

退出循环时,左边离开数组末尾,然后遵从它

相关问题