GeekBand-笔记-06

safari下的jianshu根本无法直接粘贴剪贴板里的图像啊。
请到网易云课堂笔记那儿下载附件,谢谢!

一、标准容器所提供的操作和类型可以概括如下:

二、标准容器操作复杂性如下:

三、标准容器的成员类型:

四、构造函数、析构函数和赋值操作:

五、STL算法复杂性

六、find序列算法

七、search

八、sort

九、min和max

十、迭代器萃取

十一、迭代器操作

十二、下列操作对随机访问迭代器可能更高效

十三、迭代器适配器

十四、function

十五、函数适配器

十六、
反向迭代器的定义可能如下

十七、Iterator Adapter的一种可能实现如下(对的,就是作业)
A - Iterator Adapter包括以下类型:
1) Insert Iterator
2) Stream Iterator
3) Reverse Iterator
4) Move Iterator
B - Insert Inerator包括以下类型
1) insert_iterator<class _Container>
use insert(pos, val) for all containers

2) back_insert_iterator<class _Container>
    use push_back(val) for:
    1) vector
    2) deque
    3) list
    4) string

3) front_insert_iterator<class _Container>
    use push_front(val) for:
    1) deque
    2) list
    3) forward_list

实现如下:

include <algorithm>

include <iostream>

include <deque>

include <list>

include <set>

include <vector>

include <iterator>

namespace CppWorkSTL {

// --------- 作业开始 ---------
// 作业要求的 insert_iterator
// --------------------- insert_iterator: 定义
template<class _Container>
class insert_iterator : public std::iterator<std::output_iterator_tag,
void, void, void, void> {
protected:
_Container *container;
typename _Container::iterator iter;
public:
typedef _Container container_type;

    insert_iterator(_Container &_x, typename _Container::iterator _i)
            : container(&_x), iter(_i) {}

    insert_iterator &operator=(const typename _Container::value_type &_value) {
        iter = container->insert(iter, _value);
        ++iter;
        return *this;
    }

ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES

    insert_iterator &operator=(typename _Container::value_type &&_value) {
        iter = container->insert(iter, std::move(_value));
        ++iter;
        return *this;
    }

endif

    insert_iterator &operator*() { return *this; }

    insert_iterator &operator++() { return *this; }

    insert_iterator &operator++(int) { return *this; }
};

// insert_iterator
// 提供一个 insert_iterator 以供调用
template<class _Container>
inline
insert_iterator<_Container>
inserter(_Container &_x, typename _Container::iterator _i) {
return insert_iterator<_Container>(_x, _i);
}
// --------------------- insert_iterator: 定义结束

// 题目要求的 ostram_iterator
// --------------------- ostram_iterator: 定义
template<class _Tp, class _CharT = char, class _Traits = std::char_traits<_CharT> >
class ostream_iterator
: public std::iterator<std::output_iterator_tag, void, void, void, void> {
public:
typedef _CharT char_type;
typedef _Traits traits_type;
typedef std::basic_ostream<_CharT, _Traits> ostream_type;
private:
ostream_type *_out_stream;
const char_type *_delim;
public:
ostream_iterator(ostream_type &_s)
: _out_stream((&_s)), _delim(0) {}

    ostream_iterator(ostream_type &_s, const _CharT *_delimiter)
            : _out_stream((&_s)), _delim(_delimiter) {}

    ostream_iterator &operator=(const _Tp &_value) {
        *_out_stream << _value;
        if (_delim)
            *_out_stream << _delim;
        return *this;
    }

    ostream_iterator &operator*() { return *this; }

    ostream_iterator &operator++() { return *this; }

    ostream_iterator &operator++(int) { return *this; }
};

// --------------------- ostram_iterator: 定义结束
// --------- 作业内容结束 ---------

// --------- 以下是题目之外的扩展内容 ---------
// 有出有进,istream_iterator
// --------------------- istream_iterator: 定义
template<class _Tp, class _CharT = char,
class _Traits = std::char_traits<_CharT>, class _Distance = ptrdiff_t>
class istream_iterator
: public std::iterator<std::input_iterator_tag, _Tp, _Distance, const _Tp *, const _Tp &> {
public:
typedef _CharT char_type;
typedef _Traits traits_type;
typedef std::basic_istream<_CharT, _Traits> istream_type;
private:
istream_type *_in_stream;
_Tp _value;
public:
istream_iterator() : _in_stream(0), _value() {}

    istream_iterator(istream_type &_s) : _in_stream((&_s)) {
        if (!(*_in_stream >> _value))
            _in_stream = 0;
    }

    const _Tp &operator*() const { return _value; }

    const _Tp *operator->() const { return (&(operator*())); }

    istream_iterator &operator++() {
        if (!(*_in_stream >> _value))
            _in_stream = 0;
        return *this;
    }

    istream_iterator operator++(int) {
        istream_iterator _t(*this);
        ++(*this);
        return _t;
    }

    friend
    bool operator==(const istream_iterator &_x, const istream_iterator &_y) {
        return _x._in_stream == _y._in_stream;
    }

    friend
    bool operator!=(const istream_iterator &_x, const istream_iterator &_y) { return !(_x == _y); }
};

// --------------------- istream_iterator: 定义结束

// --------------------- back_insert_iterator: 定义
template<class _Container>
class back_insert_iterator
: public std::iterator<std::output_iterator_tag,
void, void, void, void> {
protected:
_Container *container;
public:
typedef _Container container_type;

    explicit back_insert_iterator(_Container &_x) : container(&_x) {}

    back_insert_iterator &operator=(const typename _Container::value_type &_value_) {
        container->push_back(_value_);
        return *this;
    }

ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES

    back_insert_iterator &operator=(typename _Container::value_type &&_value_) {
        container->push_back(std::move(_value_));
        return *this;
    }

endif

    back_insert_iterator &operator*() { return *this; }

    back_insert_iterator &operator++() { return *this; }

    back_insert_iterator operator++(int) { return *this; }
};

// 提供一个 back_insert_iterator 以供调用
template<class _Container>
inline
back_insert_iterator<_Container>
back_inserter(_Container &_x) {
return back_insert_iterator<_Container>(_x);
}
// --------------------- back_insert_iterator: 定义结束

// --------------------- front_insert_iterator: 定义
template<class _Container>
class front_insert_iterator
: public std::iterator<std::output_iterator_tag,
void, void, void, void> {
protected:
_Container *container;
public:
typedef _Container container_type;

    explicit front_insert_iterator(_Container &_x) : container(&_x) {}

    front_insert_iterator &operator=(const typename _Container::value_type &_value_) {
        container->push_front(_value_);
        return *this;
    }

ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES

    front_insert_iterator &operator=(typename _Container::value_type &&_value_) {
        container->push_front(std::move(_value_));
        return *this;
    }

endif

    front_insert_iterator &operator*() { return *this; }

    front_insert_iterator &operator++() { return *this; }

    front_insert_iterator operator++(int) { return *this; }
};

// 提供一个 front_insert_iterator 以供调用
template<class _Container>
inline
front_insert_iterator<_Container>
front_inserter(_Container &_x) {
return front_insert_iterator<_Container>(_x);
}
// --------------------- front_insert_iterator: 定义结束

// --------- 扩展结束 ---------

} // namespace CppWorkSTL

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

推荐阅读更多精彩内容