作者khoguan (Khoguan Phuann)
看板C_and_CPP
标题Re: [问题] 请问STL的stack
时间Sat Aug 27 22:01:45 2005
※ 引述《renderer (rendering)》之铭言:
: ※ 引述《khoguan (Khoguan Phuann)》之铭言:
: : #include <stack>
: : #include <string>
: : #include <algorithm>
: : using std::stack;
: : using std::string;
: : using std::swap;
: : stack<string> piles[52];
: : // 对这 52 个堆叠进行翻天覆地的操作
: : // 分别推进了许许多多数量不等的字串。
: : // 以下是泥牛入海法
: : for(int i=0; i<52; ++i) {
: : stack<string> emp;
: : swap(emp, piles[i]);
: : }
std::swap()
里面的操作主要就是做一般 swap 时标准的三个 assign
动作。但对上面那个程式来说,实在是多做了两个不必要的动作。
所以我写了这个,後面又接着说,要这样做还不如直接
piles[i] = stack<string>(); 还更快。
至於若是属於某个 Container 专用的 swap() member function,
那就没那麽单纯了,能利用就要好好利用。
// GNU g++ libstdc++ 的 std::swap() 定义在 bits/stl_algobase.h 中
template<typename _Tp>
inline void
swap(_Tp& __a, _Tp& __b)
{
// concept requirements 这个後面会提一下
__glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
const _Tp __tmp = __a;
__a = __b;
__b = __tmp;
}
: 敢问 std::swap 的源码
: std::stack<TYPE> 不是没有 assignment 吗
: 为何可以 swap 呢
: 另外 std::stack<TYPE> 之所以没有 assignment
: 是因为 stack : Last In First Out 操作原则的关系吗
: 还是另有原因
stack 预设是「包裹」deque,deque 有提供 operator=
stack 只是一层薄外衣,里面的 data element 就是一个
protected deque suboject 而已。使用 compiler generated
default copy assignment operator 便足以让 stack 做
assign 的操作,不需另外宣告、定义。
libstdc++ 的 "concept" checking 预设没开,我把它打开来,
(cygwin是在
/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/i686-pc-cygwin/bits/c++config.h
档中,将 #define _GLIBCXX_CONCEPT_CHECKS 1
这一行 uncomment,存档以後,就可以了。其他系统上的 libstdc++ 就
locate 一下 c++config.h 这个档的位置。)
如此,可以在编译时更确保我们丢给它的参数型别,符合 STL 的要求。
像这个 std::swap() 检查的就是其参数的型别要能满足 Assignable
的性质。编译没问题,可以相当放心的认定我前面的推论。
所以,我们不必因为看它没有明白的提供 operator= ,就立即认定
不能做 copy assignment :-)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.208.168
1F:推 renderer:k大真励害 知道这些这麽深的东西 :) 61.228.217.73 08/27
2F:推 renderer:k大能不能列个书单 61.228.217.73 08/27
3F:→ renderer:让我们早日离开肉脚的行列 61.228.217.73 08/27
4F:推 khoguan:我才是大肉脚。看到没~~抖抖抖~~~(肉在抖的样子)220.130.208.168 08/27
5F:推 Keiichi:其实之前那篇书单能够看完一半以上就差不多了 59.121.162.177 08/27
6F:→ Keiichi:剩下的就是经验了吧… 59.121.162.177 08/27
7F:→ Keiichi:各位大大们都相当谦虚啊… 59.121.162.177 08/27