【问题标题】:Handling lot of items in std::stack处理 std::stack 中的大量项目
【发布时间】:2011-02-23 02:25:08
【问题描述】:

C++ std::stack 可以处理超过 10k 个 int 项目吗?它的性能如何?

【问题讨论】:

  • 不知道 10K 哪些项目的问题是模糊的。

标签: c++ stl stack


【解决方案1】:

10K 什么?大多数 std::stack 实现可以轻松处理 10K 个具有良好性能的原语,因为这可能小于 80KB。但是,该标准不保证性能。

另请注意,这取决于您使用的后端。默认是 std::deque,它基本上是一个数组数组。但是,您应该在任何后端都获得不错的性能。

【讨论】:

  • std::deque 最常实现为数组数组。数组列表不符合标准中规定的复杂性要求。
【解决方案2】:

std::stack 仅受底层容器限制(std::stack 是容器适配器)。

根据底层容器是什么,您会有不同的限制。

std::vector 将需要连续内存,而std::list 将仅受堆大小(可能还有任何堆碎片)的限制。但是std::deque(默认容器)介于两者之间;它需要较小的连续内存块,但主要受堆大小的限制。

【讨论】:

    【解决方案3】:

    性能取决于使用的底层容器。如前所述,stack 是一个适配器,底层容器可以是deque(默认),或vector,或list(都在std 命名空间中)。

    以下是性能比较的示例。由于问题中没有明确提到要存储的类型,我假设它是无符号整数。随意根据您的要求更改它。该示例构造了一个包含 100K 项的堆栈。

    stack.cpp的内容

    #include <stack>
    #include <vector>
    #include <list>
    #include <deque>
    #include <assert.h>
    
    typedef unsigned int Type;
    
    #ifdef USE_VECTOR
    typedef std::stack< Type, std::vector< Type > > StackType;
    #elif USE_LIST
    typedef std::stack< Type, std::list< Type > > StackType;
    #else
    typedef std::stack< Type, std::deque< Type > > StackType;
    #endif
    
    int main() {
        StackType mystack;
        for( unsigned int i = 0; i < 100 * 1024; ++i ) {
            mystack.push( i );
        }
        assert( mystack.size() == 100 * 1024 );
        return 0;
    }
    

    执行对比:

    $ g++ -DUSE_VECTOR stack.cpp -o stack; time ./stack
    
    real    0m0.023s
    user    0m0.030s
    sys     0m0.031s
    
    $ g++ -DUSE_LIST stack.cpp -o stack; time ./stack
    
    real    0m0.144s
    user    0m0.186s
    sys     0m0.030s
    
    $ g++  stack.cpp -o stack; time ./stack
    
    real    0m0.024s
    user    0m0.030s
    sys     0m0.015s
    
    asaha@nedata8 ~/code
    $ 
    

    以上数字是单次运行的结果。 要获得统计上显着的数字,请多次运行每个变体,并观察平均值和标准差。

    显然,deque 和 vector 的性能相似,而 list 更差。

    【讨论】:

    【解决方案4】:

    是的,它可以处理 10k。只要你有它的内存资源。如果您担心它使用内部堆栈,它不会。

    性能是特定于实现的,但应该很快

    【讨论】:

    • 堆栈溢出在这种情况下有点令人困惑...如果您的意思是您的 std::stack 可能会溢出,那么是的,有可能,但这意味着您的系统已经完全用完内存,考虑到 10K 的数字,这不太可能。至于执行堆栈的溢出,在这种情况下不适用,因为您正在处理动态内存。
    【解决方案5】:

    std::stack 不是容器,而是容器适配器。默认情况下,它使用 std::deque 作为容器,但您也可以使用 std::vector 或 std::list。当元素被移除时,双端队列会释放它们的内存。

    【讨论】:

    • 默认容器是std::deque
    猜你喜欢
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2013-01-29
    • 1970-01-01
    相关资源
    最近更新 更多