我是使用向量的新手,而且我非常熟悉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;
}
答案 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;
}