【STL】初识STL系列2

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

插入到目标后,不会覆盖已有的数据,并会自动分配内存。

猜你喜欢

转载自blog.csdn.net/shengda_mao1118/article/details/81627243
STL