² 泛型指针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() );