您的位置:首页 > 编程语言 > C语言/C++

《Essential C++》笔记三(2)、泛型编程风格

2013-10-01 23:16 176 查看
² 泛型指针Iterators

每个标准容器提供一个名为being()的操作数,可返回一个iterator,指向第一个元素。另一个名为end()的操作函数会返回一个iterator,指向最后一个元素的下一位置。

vector<string> svec;

vector<string>::iterator iter = svec.begin()

iter被定义为interator,指向一个vector,后者的元素型别为string,::表示iterator是位于string vector定义内的嵌套型别。

const vector<string> cs_vec;

vector<string>::const_iterator iter = cs_vec.begin()

欲通过interator取得元素值,我们可以采用一般的指针提领方式:

cout << “string value of element : ” << *iter;

如果要通过iter调用底部的string元素所提供的操作行为,可以使用箭头运算符:

cout << “ ( “ << iter -> size() << “ ): ” << *iter << endl;

² 使用序列式容器

list中的每个元素都包含3个字段,value、back指针(指向前一个元素)、front指针(指向下一个元素)

deque与vector类似,都以连续内存存储元素,但它对前端与后端元素的增加与删除具有更高的效率。

要使用序列式容器,首先必须含入相关的头文件:

#include <vector>

#include <list>

#include <deque>

² 定义序列式容器对象的方式:

1. 产生空的容器

list<string> slist;

vector<int> ivec;

2. 产生特定大小的容器,每个元素都以其默认值作为初值

list<int> ilist( 1024 );

vector<string> svec( 32 );

3. 产生特定大小的容器,并为其定初值

vector<int> ivec( 10, -1 )

list<string> slist ( 16, “unassigned” );

4. 通过一对iterator产生容器

int elem_vals [seq_size ] = {

1, 2, 3, 3, 4, 7, 2, 5,12, 3, 6, 10, 4, 9, 16, 5, 12, 22};

vector<int> elem_seq( elem_vals, elem_vales+seq_size);

5. 根据某个容器产生新的容器

list<string> slist; //空容器

//填充……

list<string> slisr2( slist ); //将slist复制给slist2

² 序列式容器的操作函数P79

² 使用泛型算法P81

#include <algorithm>

² 使用FunctionObject

#include <functional>

² Function Object Adapters

binder adapter绑定配接器,会将functionobject的参数绑定在某特定值身上,使二元Function Object转化为一元Function Object

bind1st会将指定值绑定至第一操作数,bind2nd会将指定值绑定至第二操作数

find_if (iter, vec.end(), bind2nd( lt, val ));

negator逆转Function Object的真伪值,not1可逆转一元FunctionObject的真伪值,not2可逆转二元Function Object的真伪值

² Map的定义

定义和输入keyvalue的简单方法:

#include <map>

#include <string>

map<string, int> words;

words[ “vermeer” ] = 1;

表达式words [ tword ] 会取出与tword相应的value,如果tword不在map内,便会因此置入map,并获得默认值0。

map<string, int>::iterator it = words.begin();

for ( ; it != words.end(); ++it )

cout<< “Key: ” << it -> first

<<“value: ” << it -> second << endl;

map对象有一个名为first的member,对应于key,本例之中便是单字字符串。另有一个名为second的member,对应于value,本例之中便是单字的出现次数。

² 查询map中的值

1. 将key当做索引:

int count = 0;

if ( ! ( count = words [ “vermeer” ] ) )

//vermeer并不存在于words map内

这种写法的缺点是,如果key不存在与map中,key会被自动加入map,相应的value被赋予默认值。

2. 利用map的find()函数(注意与泛型的find()区别)

word.find ( “vermeer” );

如果key在map中,函数会返回一个iterator,指向key/value形成的一个pair,反之则返回end()

int count = 0;

map<string, int>::iterator it;

it = words.find ( “vermeer” );

if ( it != words.end() )

count =it -> second;

3. 第三种方法是利用map提供的count()函数,函数会返回某特定项目在map内的个数:

int count = 0;

string search_word ( “vermeer” );

if ( words.count ( search_word ) )

count =words [ search_word ];

² 使用Set

默认情况下,set元素会一句其所属的型别默认的less-than运算符进行排列:

int ia[10] = {1, 3, 5, 8, 5, 3, 1, 5, 8, 1 };

vector<int> vec( ia, ia+10 );

set<int> iset ( vec.begin(), vec.end() );

iset的元素是{ 1, 3, 5, 8 }

如果要为set加入一个元素,可使用insert()

iset.insert ( ival );

如果要为set加入某个范围的元素,可使用双参数的insert()

iset.insert ( vec.begin(), vec.end() );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: