The C++ standard library(侯捷/孟岩 译) 10--Special Containers

10 Special Containers(p435)

概述:

1. container adapters:
   1). stack
   2). queue
   3). priority queue

2. bitset

10.1 stack

#include <stack>
LIFO : last in first out
可能实现如下:

namespace std
{
    template <class T, class Container = deque<T> > class stack
    {
        public:
            typedef typename Container::value_type value_type;
            typedef tupename Container::size_type size_type;
            typedef Container container_type;

        protected:
            Container c;    // container

        public:
            explicit stack (const Container& = Container() );

            bool empty() const {    return c.empty();}
            size_type size() const {    return c.size();}
            void push( const value_type& x) {c.push_back(x);}
            void pop() {    c.pop_back();}
            value_type& top() { return c.back();}
            const value_type& top() const { return c.back();}
    };

    template <class T, class Container> 
        bool operator== (const stack<T, Container>& , const stack<T, Container>& );

    template <class T, class Container>
        bool operator< (const stack<T, Container>& , const stack<T, Container>& );

    //... other comparision operators
}

10.2 queue(p444)

#include <queue>
FIFO : first in first out
可能实现如下:

namespace std
{
    template <class T, class Container = deque<T> > class queue
    {
        public:
            typedef typename Container::value_type value_type;
            typedef typename Container::size_type size_type;
            typedef typename container_type;

        protected:
            Container c;    // container

        public:
            explicit queue(const Container& = Container());

            bool empty() const {    return c.empty();}
            size_type size() const {    return c.size();}
            void push( const value_type& x) {   c.push_back(x);}
            void pop()  {   c.pop_front();}
            value_type& front() {   return c.front();}
            const value_type& front() const {   rerurn c.front();}
            value_type& back() {    return c.back();}
            const value_type& back() const {    return c.back();}
    };

    template <class T, class Container>
        bool operator== (const queue<T, Container>& , const queue<T, Container>& );

    template <class T, class Container>
        bool operator< (const queue<T, Container>& , const queue<T, Container>& );

    //... other comparision operators
}

乍一看,关于泛型之类的定义结构,和pair有些相似呢

10.3 priority queue(p453)

#include <queue>
基于heap。

namespace std
{
    template <class T, class Container = vector<T> ,
             class Compare = less<typename Container::value_type> > 
    class priority_queue
    {
        public:
            typedef typename Container::value_type value_type;
            typedef typename Container::size_type size_type;
            typedef typename Container container_type;

        protected:
            Compare comp;   // sorting criterion
            Container c;    // container

        public:
            // constructor
            exlicit priority_queue(const Compare& cmp = Compare(),
                    const Container& cont = Container():
                    comp(cmp), c(cont)
            {
                make_heap(c.begin(), c.end(),comp));
            }

            template <class InputIterator>
            priority_queue(InputIterator first, InputIterator last,
                        const Compare& comp = Compare(),
                        const Container& cont = Container() ):
                comp(cmp), c(cont)
            {
                c.insert(c.end(), first, last);
                make_heap(c.begin(), c.end(), comp);
            }

            void push(const value_type& x)
            {
                c.push_back(x);
                push_heap(c.begin(), c.end(), comp);
            }

            void pop()
            {
                pop_heap(c.begin(), c.end(), comp);
                c.pop_back();
            }

            bool empty() const {    return c.empty();}
            size_type size() const {    return c.size();}
            const value_type& top() const { return c.front();}
    };
}

10.4 bitset(p460)

#include <bitset>
生成-拷贝-销毁

bitset<bits>::bitset()   default ctor所有位初始化为0;
bitset<bits>::bitset(unsigned long value) 以整数值value的位初始化;

explicit bitset<bits>::bitset(const string& str)
bitset<bits>::bitset(const string& str, string::size_type str_idx)
bitset<bits>::bitset(const string& str, string::size_type str_idx, 
                     string::size_type str_num)
以字符串或其子串  初始化;str_idx是str中用于初始化的第一个字符;
缺省str_num时默认从str_idx开始到str结束的所有字符 用于初始化。
若str_idx > str.size()会抛出 out_of_range异常。

Nonmanipulating Operation

size_t bitset<bits>::size() const 返回位数;
size_t bitset<bits>::count() const 返回1的个数;
bool bitset<bits>::any() const判断是否有任何位被设立(数值为1);
bool bitset<bits>::none() const 判断是否没有任何一位被设立;
bool bitset<bits>::test (size_t idx) const 
       判断idx位置的位是否被设立(会检查idx>=size()并抛异常);
bool bitset<bits>::operator== (const bitset<bits>& bits) const 
       判断*this==bits;
bool bitset<bits>::operator!= (const bitset<bits>& bits) const

manipulating operation

bitset<bits>& bitset<bits>::set() 将所有位置1;
bitset<bits>& bitset<bits>::set(size_t idx);
bitset<bits>& bitset<bits>::set(size_t idx, int value) 
              根据value来设定idx位置的值;
bitset<bits>& bitset<bits>::reset() 将所有位置为0;
bitset<bits>& bitset<bits>::reset(size_t idx);
bitset<bits>& bitset<bits>::flip() 反转所有位,即取反;
bitset<bits>& bitset<bits>::flip(size_t idx);
bitset<bits>& bitset<bits>::operator ^=  (const bitset<bits>& bits) 异或操作;
bitset<bits>& bitset<bits>::operator |= (const bitset<bits>& bits) 或操作;
bitset<bits>& bitset<bits>::operator &= (const bitset<bits>& bits) 与操作;
bitset<bits>& bitset<bits>::operator <<=(size_t num) 左移num位;
bitset<bits>& bitset<bits>::operator >>=(size_t num) 右移num位;

operator[] 存取位

bitset<bits>::reference bitset<bits>::operator [] (size_t idx)
bool bitset<bits>::operator [] (size_t  idx) const
对于reference,允许如下五种操作:
1. reference& operator= (bool) 根据传来的值设置该位;
2. reference& operator= (const reference&) 根据另一个reference设置该位;
3. reference& flip() 翻转;
4.operator bool() const 将该位转换为布尔值;
5. bool operator ~() const 返回该位的补码(翻转值);
  eg:
    bitset<50> flags;
    flags[42] = true;  
    flags[13] = flags[42];
    flags[42].flip();
    if (flags[13] ) {  flags[10] = ~flags[42];  }

产生新的(经修改的)bitset

bitset<bits> bitset<bits>::operator ~() const
bitset<bits> bitset<bits>::operator <<(size_t num) const
bitset<bits> bitset<bits>::operator >>(size_t num) const
bitset<bits> operator &(const bitset<bits>& bits1, const bitset<bits>& bits2)
bitset<bits> operator | (const bitset<bits>& bits1, const bitset<bits>& bits2)
bitset<bits> operator ^ (const bitset<bits>& bits1, const bitset<bits>& bits2)

型别转换

unsigned long bitset<bits>::to_ulong() const 
    返回所代表的整数(若unsigned long 不足以表示该整数,则抛出overflow_error异常)
string bitset<bits>::to_string() const 
    返回一个string,该string表现该bitset的二进制值

IO 操作

istream& operator >> (istream& strm, bitset<bits>& bits)
  将'0'和'1'读入bits,若不是'0'或'1'则读取结束;
  读入的位少于bits的位数,则前面补0;
ostream& operator<< (ostream& strm, const bitset<bits>& bits)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容