【发布时间】:2011-02-23 02:25:08
【问题描述】:
C++ std::stack 可以处理超过 10k 个 int 项目吗?它的性能如何?
【问题讨论】:
-
不知道 10K 哪些项目的问题是模糊的。
C++ std::stack 可以处理超过 10k 个 int 项目吗?它的性能如何?
【问题讨论】:
10K 什么?大多数 std::stack 实现可以轻松处理 10K 个具有良好性能的原语,因为这可能小于 80KB。但是,该标准不保证性能。
另请注意,这取决于您使用的后端。默认是 std::deque,它基本上是一个数组数组。但是,您应该在任何后端都获得不错的性能。
【讨论】:
std::stack 仅受底层容器限制(std::stack 是容器适配器)。
根据底层容器是什么,您会有不同的限制。
std::vector 将需要连续内存,而std::list 将仅受堆大小(可能还有任何堆碎片)的限制。但是std::deque(默认容器)介于两者之间;它需要较小的连续内存块,但主要受堆大小的限制。
【讨论】:
性能取决于使用的底层容器。如前所述,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 更差。
【讨论】:
back()、push_back() 和pop_front()。来源:gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/…
是的,它可以处理 10k。只要你有它的内存资源。如果您担心它使用内部堆栈,它不会。
性能是特定于实现的,但应该很快
【讨论】:
std::stack 不是容器,而是容器适配器。默认情况下,它使用 std::deque 作为容器,但您也可以使用 std::vector 或 std::list。当元素被移除时,双端队列会释放它们的内存。
【讨论】:
std::deque