首页 » C/C++ » C++标准模版库 - STL

auto_ptr

auto_ptr销毁时自动删除它指向的对象。要注意多个auto_tpr不能指向同一对象,否则对象会被删除多次,会导致未定义的行为。auto_ptr的copy constructor/assignment的行为被定义为:当执行这两个函数后,它们本身会变成null,而复制所得之指针将获取资源的唯一拥有者(托管权的转移):

#include <memory>

int main()
{
    std::auto_ptr p1(new int(1));
    std::auto_ptr p2(p1);

    std::auto_ptr p3;
    p3 = p2;

    return 0;
}

在完成复制后,p1/p2就被置为null。因为auto_ptr的复制行为“不正常”,所以他们不能作为STL容器元素。shared_ptr则没有这个问题。shared_ptr是一种引用计数型智能指针(RCSP,Reference Counting Smart Pointer),它可以持续跟踪多少对象指向同一资源,并在无人指向它时自动释放该资源。因为shared_ptr的复制行为“正常”,所以可以用于STL容器。

auto_ptr/shared_ptr释放资源时总调用delete而非delete[],所以如果要动态管理数组,用vector等容器,而非auto_ptr。

<stack>

stack是后进先出队列(LIFO),它的接口包括:empyt(), size(), top(), pop(), push()。

int main()
{
    std::stack s;
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);

    std::cout << s.size() << "\n";
    while(!s.empty()) {
        std::cout << s.top() << " ";
        s.pop();
    }
    std::cout << "\n";

    return 0;
}

输出

4
4 3 2 1 

<queue>

queue

queue是先进先出队列(FIFO),它的接口包括:empty(), size(), front(), back(), push()。

int main()
{
    std::queue q;
    q.push(1);
    q.push(2);
    q.push(3);
    q.push(4);

    std::cout << q.size() << "\n";
    std::cout << q.back() << "\n";
    while(!q.empty()) {
        std::cout << q.front() << " ";
        q.pop();
    }
    std::cout << "\n";

    return 0;
}

输出

4
4
1 2 3 4 

priority_queue

priority_queue是优先队列,它的接口包括:empty(), size(), top(), pop(), push()。

int main()
{
    std::priority_queue<int> q;
    q.push(10);
    q.push(59);
    q.push(23);
    q.push(61);

    std::cout << q.size() << "\n";
    while(!q.empty()) {
        std::cout << q.top() << " ";
        q.pop();
    }
    std::cout << "\n";

    return 0;
}

输出

4
61 59 23 10 

<exception>

std::exception:

class exception {
    public:
        exception () throw();
        exception (const exception&) throw();
        exception& operator= (const exception&) throw();
        virtual ~exception() throw();
        virtual const char* what() const throw();
}

这里限定了成员函数不允许抛出异常。

分享

0