这是c ++ 11。使用两个堆栈的堆栈的直接排序功能。 虽然在sort()函数中调试tempStack正确填充但sort()函数返回空对象?
我试图添加std :: move()或std :: forward(),但这是不正确的。一般sort()算法是正确的!此代码已成功编译。 c ++ 11的一些错误(移动语义)!
我的想法(不正常!): 返回>(tempStack); return move(tempStack);
代码(sort()):
template<typename T>
Stack<T> sort(Stack<T> &input)
{
if(input.isEmpty()) return Stack<T>();
Stack<T> tempStack;
while(!input.isEmpty())
{
T element = input.pop();
while(!tempStack.isEmpty() && tempStack.peek() > element) input.push(tempStack.pop());
tempStack.push(move(element));
}
return tempStack;
}
代码(堆栈类):
template <typename T>
class Stack
{
public:
Stack() : top(nullptr), stackSize(0)
{}
Stack(Stack &&other) : top(std::move(other.top)), stackSize(std::move(other.stackSize)) {}
~Stack() { while (!isEmpty()) pop(); }
void push(T &&value)
{
auto n = new Node(std::forward<T>(value), top);
top = n;
++stackSize;
}
T &peek()
{
if (!top) throw StackIsEmptyException();
return top->value;
}
T pop()
{
if (!top) throw StackIsEmptyException();
auto value(std::move(top->value));
auto n = top;
top = n->next;
delete n;
--stackSize;
return value;
}
bool isEmpty() const { return !top; }
size_t size() const { return stackSize; }
class StackIsEmptyException
{};
private:
struct Node
{
Node(T &&v, Node *n): value(std::move(v)), next(n)
{}
Node(const T &v, Node *n): value(v), next(n)
{}
T value;
Node *next;
};
Node *top;
size_t stackSize;
};
代码(main()):
Stack<int> s;
s.push(34);;
s.push(3);
s.push(31);
s.push(98);
s.push(92);
s.push(23);
cout << sort(s).peek() << endl;
答案 0 :(得分:3)
这条线路运行时会发生什么?
while (scnr.hasNextLine()) {
String text = scnr.nextLine();
System.out.println(text);
String data[] = text.split(",", -1);
System.out.println(Arrays.toString(data));
Students.add(new Student(data[0], data[1], data[2], data[3]));
}
return tempStack;
被移动到临时对象。tempStack
被销毁。在第1步中,tempStack
的{{1}}和top
被复制到临时对象(即移动构造函数的作用)。
在步骤2中,释放堆栈中的所有项目。
在第3步中,此返回对象的stackSize
现在指向已释放的内存。
你的移动构造函数应该将移动的对象的tempStack
设置为NULL(并且可能还top
为0),以便该对象在&##时不会解除分配任何内容39; s被毁坏了。
答案 1 :(得分:0)
重要的是通知移动的对象它不应该销毁其资源。例如,如果物体被移动,您可以使用防护装置来防止清洁叠层。
像:
Stack(Stack &&other) : top(std::move(other.top)), stackSize(std::move(other.stackSize)) { other.moved = true; }
~Stack() { if (!moved) while (!isEmpty()) pop(); }