Generic Programming

STL

  • 容器
    • 顺序性容器:vector、list、deque(对于前端的插入效率更高)
    • 关联性容器:便于快速查值。set(只含有key)、map(一对对的key/value)
  • 泛型算法:提供了许多可作用于容器类及数组类型上的操作
    • find()
    • sort()
    • replace()
    • ...

The Arithmetic of Pointers

Making Sense of Iterators

定义使用标准容器的iterator

       每个标准容器都提供有一个名为begin()end()的操作函数,返回的iterator分别指向第一个元素和指向最后一个元素的下一个位置。
       所以不管怎么定义一个iterator对象,都是对其进行赋值、比较、递增、提领操作。

  1. 迭代对象的类型决定如何访问下一元素
  2. iterator所指的元素类别决定提领操作的返回值

如果我们要定义iterator来指向容器的开始或者结尾

#include <vector>
#include <iterator>
// 以vector为例
typename vector<int>::iterator iter1 = vec.begin();
typename vector<int>::iterator end_iter = vec.end();
typename vector<int>::const_iterator iter2 = vec.begin(); //不允许修改

// 遍历操作
for (; iter1 != end_iter; ++iter1)
{
    cout << *iter1 << ' ';
}

注意 :为什么要在typename vector<int>::iterator使用typename

在vc6.0下,如果不加typename,是可以编译的;但是在gcc下,就不能。
原因大概是要让编译器认为iterator是一个类型,而不是数据成员(这里很模糊,也不知道是否正确,如果想起来查阅资料会补充的)

Operations Common to All Containers

容器类共通操作(包括string)

  • equality == 和inequality != ,返回truefalse
  • assignment = ,复制
  • empty() 返回truefalse
  • size() 返回容器类元素个数
  • clear() 删除所有元素
  • begin() 返回一个iterator,指向第一个元素
  • end() 返回一个iterator, 指向最后一个元素的下一个位置
  • insert() 插入
  • erase() 删除

Using the Sequential Containers

顺序容器的定义

list<int> slist;
vector<int> vec;
  • 特定大小
list<int> slist(100);
vector<int> vec(100);
  • 特定大小,每一个元素给定同样的初值
list<int> slist(100, -1); // 全是-1
vector<int> vec(100, 1);
  • 通过iterator产生容器
int ia[3] = {1, 2 ,3};
vector<int> fib(ia, ia + 3);
  • 复制
list<int> list1;
list<int> list2(list1);

Using the Generic Algorithms

#include <algorithm>
  • find():找到的iterator指向该目标,没找到指向last
  • binary_search():用于有序集合搜索,搜到目标返回true否则返回false
  • count()
  • search()
  • ...

How to Design a Generic Algorthm

思想:点->面,不断的将一个算法泛型化

// bind2nd() 绑定适配器 还没有讲到
template <typename InputIterator, typename OutputIterator, typename Elemtype, typename Comp>
OutputIterator filter(InputIterator first, InputIterator last, OutputIterator at, const Elemtype &val, Comp pred)
{
    while ((first = find_if(first, last, bind2nd(pred, val))) != last) {
        cout << *first << endl;
        *at++ = *first++;
    }
    return at;
}

Function Object Adapter

绑定适配器(暂时没有详细内容)

Using a Map

使用

#include <map>
#include <string>
map<string, int> words;
// 输入key/value最简单的方式
words["iAmKey"] = 1;

// 统计次数
string str;
while (cin >> str)
    words[str]++;

查询map中是否存在key

  • 将key当成索引使用,但是如果map中没有,会将它放入map里
int count = 0;
if (!(count = words["lalala"])
    // 
  • 利用map的find()不是泛型的find(),入股哦存在会返回一个iterator,反之返回一个end()
words.find("lalala");
  • 利用map的count(),返回个数
if( words.count("fasdf"));
    // 

Using a Set

使用

#include <set>
#include <string>
set<string> iset;

插入

iset.insert(ival);
iset.insert(vec.begin(), vec.end());

How to Use Iterator Inserters

Using the iostream Iterator

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