我怎么能实现堆栈向量?

时间:2015-01-04 19:03:14

标签: c++ vector stack

我目前正在尝试使用堆栈向量实现一个类。该类应作为其他对象的堆栈,但在内部将数据分发到最大大小的不同堆栈。如果堆栈已满,则会创建一个新堆栈并将其推送到内部向量。

感谢。

示例代码:

#include <iostream>
#include <stack>
#include <vector>
using namespace std;

template <class T>
class SetOfStack {
public:
    SetOfStack( int max_size ): current_stack(0), max_stack_size(max_size) {
            stacks.reserve(10);
            stacks.push_back( new stack<T> );
    }

    ~SetOfStack() {
            stacks.clear();
    }       

    void push( T value ) {
            stacks[current_stack].push(value);
            if(stacks[current_stack].size() > max_stack_size) {
                    stacks[current_stack].push_back(new stack<T>);
                    current_stack++;
                    if(current_stack % 10 == 0 && current_stack > stacks.size()) {
                            stacks.reserve(stacks.size() + 10);
                    }
            }
    }

    T pop() {
            T value = stacks[current_stack].top();
            stacks[current_stack].pop();

            if(stacks[current_stack].size() == 0 && current_stack != 0 ) {
                    stacks[current_stack].pop_back();
                    current_stack--;
            }
    }

    T popAt( int index ) {
            T value = stacks[index].top();
            stacks[index].pop();
    }

private:
    int current_stack;
    int max_stack_size;
    vector< stack<T> > stacks;
};


int main() {
    // Test code
    SetOfStack<int> s_o_s(3);
    s_o_s.push(1);
    cout << s_o_s.pop() << endl;
    return 0;
}

解决方案:问题是new中的push_back是不必要的,因为向量已经分配了内存。 另一个错误是我写了stacks[current_stack].push_back(new stackT>());它只是stacks.push_back(stackT>());

1 个答案:

答案 0 :(得分:5)

你得到的错误是这一行:

stacks.push_back( new stack<T> );

以及这一行:

stacks[current_stack].push_back(new stack<T>);

因为您已将堆栈声明为非指针:

vector< stack<T> > stacks;

因此,您只想使用stack<T>()代替new stack<T> 此外,std::stack没有push_back功能,您需要使用push

stacks.push_back(stack<T>());
stacks[current_stack].push(value);

以及pop而不是pop_back()

stacks[current_stack].pop();

此时,您不再需要我在原始评论中提及的删除,因为您似乎不打算致电new