C++ Primer Plus 第16章读书笔记。
1.list 模板类: 双向链表。
专用成员函数: merge() remove(val) sort() splice(pos,list <T,Alloc> x) unique()
合并链表 移除所有val值 把链表插入到pos 去除重复值,每个值只留一个
2.insert 和spilce区别
insert 把原始区间的副本插入,splice把原始区间移动,移动完后,原始地址为空。
3.set / map / multimap
set:直译为数学的集合。有许多数学函数。(可反转)
set的2个特性,所以值(键)是唯一的,无需unique(),且set是排序的。
set_union ( A.begin() , A. end() , B.begin() , B.end() , out ) 并集 //out为定义好的输出迭代器
set_intersection( A.begin() , A. end() , B.begin() , B.end() , out ) 交集
set_difference (A.begin() , A. end() , B.begin() , B.end() , out ) A集合 去除掉 AB交集的 元素
copy( A.begin() , A.end() , out) 使用copy函数来输出set A
xxx.insert( a ) set为有序容器,插入元素后,自动排序。
xxx.insert (A.begin() , A.end() ) 只需要指出要输入的信息,不用写位置,自动排序
map 特性: 使用 键作为 索引。
举例:
map< string, int > wordmap;
for (auto si = wordset.begin() ; si != wordset.end() ; si++ )
wordmap [*si ] = count (words.begin() , words.end() ; *si ) 赋值号右侧,是count函数,在容器words中出现 *si的次数。
赋值号左侧的wordmap是 一对Pair <string, int> 把 count的值赋给 *si那对。
multimap
multimap 是可反转,经过排序的,和map一样,储存pair < class T, class U > 队列,根据键来排序
pair < const keytype, datatype > 前者是键类型,后者存储的数据类型。
声明方式1:
pair <const int , string > item (213, "Los Angeles"))
codes.insert( item)
声明方式2:
codes.insert( pair <const int , string > (213, "Los Angeles")) // 这个是匿名的pair ,直接insert,不命名pair
equal_range() 以键为参数,返回一个pair,这个pair(val1, val2) val1,val2是一个区间(一对迭代器),
区间内所有的值 都符合键。例如 键213 对应 5个值,这个range就刚刚好包括这5个值。
4. transform ( )
transform ( A.begin() , A. end() , out , sqrt ) : 参数4 可以替换为 任何函数对象,
1 2 3 4 参数1,2为输入,输入内容,进行参数4的运算,再输出到3.
还有5个参数的版本,可以运用大量 函数符来表示 内置的算术运算,关系运算和逻辑运算。
transform (A.begin(), A.end(), B.begin(), out , plus<double> ) 参数1,2为A,参数3为B,将A和B进行 运算5,再输出
1 2 3 4 5 到参数4的输出迭代器。4可以用 insert() 选择插入位置。
在书本P711页有plus<> , minus <> , multiplies<>,等等函数符来 配合 transform使用,也可以用自定义函数对象。
double add( double x, double y ) {return x + y)
transform (A.begin(), A.end(), B.begin(), out , add) ;
5. count ( ) / remove_if ( )
count ( A.begin() , A.end() , x ) 在区间内值等同x的次数,返回int。
remove_if ()
例:bool toobig (int n) { return n > 100} // 定义一个bool函数,内容为一个条件等等
list <int > scores; .....
scores.remove_if (toobig) ; //把函数作为参数,在 scores内,满足toobig 的返回值为1的元素都移除。
6.back_insert_iterator / front_insert_iterator / insert_iterator
插入到目标后,不会覆盖已有的数据,并会自动分配内存。