向量迭代器+偏移超出范围

时间:2016-12-20 00:33:44

标签: c++ arrays vector

我是使用向量的新手,而且我非常熟悉C ++。我想创建一个旋转数组多次的函数并返回数组,这样我就可以拥有相同向量但旋转不同的多个数组。我这样做,所以我可以移动原始数组的位而不改变数组的初始值。现在我真的在挠头。 const 2d数组故意小,因为我知道大小与我的问题无关。

#include <algorithm>
#include <vector>
#include <iterator>

const int myconsts[1][8] = { 
   { 1, 2, 3, 4, 5, 6, 7, 8}
};

这是我的旋转功能

int *RotateAndErase(int rotNum) {
  int Shifted[8];
  int vectAdd = 0;
  std::vector<int> Shift;
  Shift.resize(sizeof(myconsts[0]));

  do {
    // Adds the constants to each vector
    Shift.push_back(myconsts[0][vectAdd]);
    vectAdd++;
  } while (vectAdd < 8);
  // rotates desired direction(negative is right. positive is left)
  std::rotate(Shift.begin(), Shift.begin() + (rotNum), Shift.end());
  std::copy(Shift.begin(), Shift.end(), Shifted);
  return Shifted;
  Shift.erase(Shift.begin(), Shift.begin() + 8);
  delete Shifted;
}

如何在我的班级中调用

class myclass {
 public:
  myclass() {
    int* Shift2 = RotateAndErase(2);
  }
}

如何在主

中调用
int main() {
    myclass();
    return 0;
}

2 个答案:

答案 0 :(得分:0)

此代码中存在几个问题。导致错误的是:

std::vector<int> Shift;             # size is 0
Shift.resize(sizeof(myconsts[0]));  # size is 8*sizeof(int)

do {
Shift.push_back(myconsts[0][vectAdd]); # each push_back increases size by 1
vectAdd++;
} while (vectAdd < 8);
# size is now 8*sizeof(int) + 8
...
std::copy(Shift.begin(), Shift.end(), Shifted); # ouch! Shifted is int[8]

(你还会返回指向已失效的局部变量的指针,但一次只能做一件事。)

编辑:正如Ryan Haining和Mark Lakata指出的那样,我在resize()之后错误地认为它的大小,它只是8 * sizeof(int),而不仅仅是8

答案 1 :(得分:0)

这篇帖子让我感到非常愚蠢。我的课程中的其余功能看起来与此类似。我发现我必须将Shift.resize()更改为Shift.reserve()。我使用std::cout来获取 sizeof shift,int和我的数组的大小 ,然后添加它们并将它们放入Shift.reserve()。旋转数不能高于向量中的元素数量后,它给了我相同的错误

这是我的精炼代码

std::vector<int> Rotate(int n, int arr[][8], int row) {
        int i = 0;
        std::vector<int> shift;
        //amount of bytes
        shift.reserve(sizeof(long) * 8);
        //amount of elements
        shift.resize(8);
        std::cout << "in: ";
        for (int i = 0; i < 8; i++) {
            std::cout << arr[row][i] << " ";
        }
        std::cout << std::endl;
        do {
            shift[i] = arr[row][i];
            i++;
        } while (i < 8);
        std::rotate(shift.begin(), shift.begin() + (n % 8), shift.end());

        std::cout << "out: ";
        for (int i = 0; i < 8; i++) {
            std::cout << shift[i] << " ";
        }
        return shift;
    }