【发布时间】:2016-12-20 00:33:44
【问题描述】:
我是使用向量的新手,而且我对 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);
}
}
它是如何在 main 中调用的
int main() {
myclass();
return 0;
}
【问题讨论】:
-
为什么不
const int myconsts[] = {1, 2, 3, 4, 5, 6, 7, 8};?您正在按字节数调整大小,而不是myconsts[0]中的元素数 -
您的代码中有一些严重的错误...超出范围是您现在最不担心的问题。例如,
return Shifted返回一个指向本地堆栈变量(错误)的指针,然后停止执行接下来的 2 行代码。 -
delete Shifted;没有意义,因为您没有将Shifted分配给new。 -
抛开你的问题,问你几个问题:首先,你为什么要混合向量和数组?我看到的唯一原因是从一个转换到另一个,但除此之外......其次,您可能真的想阅读教程。为什么叫擦除?我可以假设您在 C 方面有一些经验,并且不习惯为您做所有繁琐的事情吗?最后一件事,为什么要使用大写的变量名?很不寻常。我的意思是,当然可以使用不寻常的编码风格,但我必须说,一开始我很困惑,乍一看并没有将 Shift 视为变量。
-
@Aziuth 我以前从未使用过向量。我来自 C 和 C# 背景,我才刚刚开始使用 C++。我最初以为我只需要使用向量来旋转数组,但我找到了一个更简单的解决方案。我通常只在函数中使用变量名