C++总结-标准库
一、 容器
1. 顺序容器
1) 定义,初始化,赋值
初始化:
a) 默认构造函数(最常用的方式)
b) 用其他相同容器初始化,包括用容器本身,或用迭代器
c) 能构造拥有n相同元素容器的构造函数,包括有元素或默认元素的形式
赋值:
a) 使用重载的“=”。
b) 使用容器函数assign( )。
c) 使用容器函数swap( ),具有较高的性能(事实上只交换某些内部指针),这个函数的功能是交换两个容器内的函数。
2) 操作
添加:
a) 尾部插入元素,push_back( )。
b) 头部插入元素,push_front( ),只适用于list和deque。
c) 任意位置插入元素,insert( ),要指明插入的位置和插入的元素.
d) 任意位置插入另个容器或容器中的元素,splice( ),只适用list
删除:
a) 删除尾元素,pop_back( )
b) 删除头元素,pop_front( ),只适用于list和deque
c) 删除任意位置元素,erase( ),参数是迭代器。
d) 删除特定值或判断值为true的元素,remove(), remove_if(), 只适用list
e) 全部清空,clear( )
大小:
a) 获得容器中元素的个数size( )
b) 重新设定容器的大小,resize( )
c) 已经分配的空间能够存储元素的个数capacity( ), 只有vector有
d) 设置预留的额外的存储空间中元素的个数reserve( ),只有vector有
关系:
a) 比较的容器必须具有相同的容器类型和其元素类型。
b) 容器的比较是基于容器内的元素的比较。
c) 包括常用的比较操作符==,!=,<,<=,>,>=。采用字典式顺序比较原则。
3) 访问
函数:调用时,容器不能为空。
a) 返回容器最后一个元素,back( )
b) 返回容器第一个元素,front( )
下标:只适用于vector和deque
a) c[n]:不会进行范围检查,如果越界,会引发未定义行为。
b) at(n):会进行范围检查,如果溢出,则会抛出out_of_range异常
迭代器:
4) 类型别名:
整形:size_type, diference_type
迭代器类型:iterator, const_iterator, reserve_iterator
引用:reference, const_reference
2. 关联容器(set,multimap,multiset均不支持下标操作)
1) 定义,赋值,初始化
初始化:
a) 默认构造函数。
b) 用相同类型的容器初始化,包括容器本身或是迭代器。
c) 使用指定的排序准则初始化。
赋值:
a) 使用重载的“=”。
b) 互换两个容器的元素,使用容器函数swap( )。
2) 操作
添加:
a) 使用下标操作来进行添加,只适用于map。
b) 使用insert( )函数,要指明插入的元素,注意对函数返回值的应用
删除:
a) 删除任意位置元素,erease( ),参数可以是元素,也可以是迭代器。
b) 全部清空,clear( )
关系:
d) 比较的容器必须具有相同的容器类型和其元素类型、比较准则。
e) 容器的比较是基于容器内的元素的比较。
3) 访问
a) 迭代器:是双向迭代器。
二、 迭代器
1. 迭代器操作(没有特殊标注的表明支持所有标准库容器)
解引用:
a) 获得整个元素。
b) 获得元素中的某个成员。
算数运算:
a) 自增,自减 。
b) 迭代器加减法的复合赋值运算,只适用于vector和deque。
c) 迭代器加(减)整数,只适用于vector和deque。
d) 迭代器相互减,只适用于vector和deque。
关系:
a) 比较是否相等。
b) 大于(等于)或小于(等于),只适用于vector和deque。
2. 迭代器种类
a) 常规迭代器:iterator,用begin( ), end( ) 赋值
b) 反向迭代器:reverse_iterator, 用rbegin( ), rend( ) 赋值
c) 插入迭代器:back_inserter, front_inserter, inserter,用容器对象初始化。
d) iostream迭代器:ostream_iterator, istream_iterator,用容器对象初始化。
3. 迭代器与const结合,范围,失效
a) const与迭代器,const_iterator:自身能改变,但是不能用了改变其所指向的元素的值。const 的iterator对象是说不能改变iterator的自身,但是可以用了改变所指向的元素的值。
b) 失效:
c) 范围:左闭右开。
三、 算法
1. 概述
a) 泛型算法只单独依赖迭代器和迭代器操作实现,本身不执行容器操作。
b) 算法从不直接添加或删除元素,但可以改变存储在容器中的元素的值,也可以再容器内移动元素。
2. 算法分类
1) 只读算法
a) Find( )
b) Accumulate( ): 对要累加的元素类型一无所知
c) Find_fisrt_of( ): 查找任意元素。
2) 写容器元素的算法
a) 写入输入序列的元素,fill( ),replace( )
b) 不检查写入操作的算法,fill_n( )
c) 写入到目标迭代器的算法,copy( ),replace_copy( )
3) 对容器元素重新排序的算法
a) 去除重复,unique( )
b) 排序算法,sort( ),stable_sort( )
3. 算法的结构
a) 按对元素的操作对算法分类。
b) 算法的形参模式。
c) 算法的两种函数命名和重载的规范定义。
四、 String类型
1. 定义、初始化、赋值(其他许多函数的参数类型都与string构造函数的类型相同和相识)
初始化:
a) 默认构造函数。
b) 令一个string类型进行初始化:
i. String对象初始化。
ii. 指向string对象的一对迭代器初始化。
iii. String对象和其中的一个下标。
iv. String对象、下标和长度。
c) C字符串类型:
i. C风格字符串直接初始化。
ii. C风格字符串和长度。
d) n个相同字符进行初始化(不包括只需要一个长度参数的构造函数)。
赋值:
a) 等号赋值,被赋值的可以使string类型,也可是是c风格字符串。
b) Swap( )函数,能够交换两个string类型。
c) Assign( )赋值函数。
2. String的操作
添加:
a) Push_back( ),在string尾部添加字符。
b) Insert( ),在string任意位置添加字符。
删除:
a) Erase( ):删除指定元素。
b) Clear( ):清空元素。
大小:
a) 获得容器中元素的个数size( )
b) 重新设定容器的大小,resize( )
c) 已经分配的空间能够存储元素的个数capacity( )
d) 设置预留的额外的存储空间中元素的个数reserve( )
查找:
a) 精确查找:find( ),rfind( )。
b) 任意查找:find_first_of( ), find_last_of( ), find_first_not_of( ), find_last_not_of( )
关系:
a) 支持所有的关系操作符,(个人认为这些比较是基于char类型的比较,也就是ascii码的比较)。
b) Compare(),根据返回值判断比较的结果。
String特有操作:
a) Substr( ),返回当前string对象的子串。
b) Append( ),在string对象的末尾添加字符串。
c) Replace( ),将指定字符插入到指定位置,从而替换string对象中已经存在的字符串。
3. 访问
迭代器:
下标:
a[n]或at(n)
五、 具体容器
1. Vector
支持随机存取。在末端附加或删除元素性能很好,在前端或中间插入或删除元素性能较低。
2. Deque
不提供容量操作(capacity(),reserve()),提供头部的插入和删除操作(push_front(),pop_front())
3. List
不支持随机存取。Deque迭代器是双向迭代器(而非随机)在任何位置插入或删除元素都非常快。安插和删除元素不会使指向其他元素的各个pointers,referencs,iterators,失效。不支持容量或空间重新分配的函数(capacity(),reserve())。提供了一些特殊的成员函数,专门用于移动元素,较之同名的stl通用算法,这些函数执行更快。
特殊变动操作:
Unique(): 移除相邻而且数值相等的重复元素。
Splice(): 插入另一个容器或另一个容器中的元素。
Sort( ):排序。
Merge( ):归并。
Reserve( ):反序。
4. Set和multiset
Set和multiset通常以平衡二叉树来完成。
不能改变元素值,这样会打乱原本的顺序。
由于迭代器是双向迭代器,对于只能用于随机存取迭代器的stl算法set和multiset则不能用。由于所有元素都不能改变,于是无法对set和multiset调用变动性算法。
不同排序准则(元素类型相同)引起的型别不同:这种情况,两种容器不能直接相互赋值或比较。这种容器的比较只能用比较算法,而不能用关系操作符。但是这两种容器可以相互初始化,因为初始化时有用的知识是容器中的元素,排序准则并不起作用。
特殊的搜索函数:
Count(elem) 返回元素elem的元素个数。
Find(elem) 返回元素elem的第一个元素。
Lower_bound(elem) 返回elem的第一个可安插位置。
Upper_bound(elem) 返回elem的最后一个可安插位置。
Equal_range(elem) 返回一个pair,表示 elem可安插的第一个位置和最后一个位置。
5. Map和multimap
Map和multimap通常以平衡二叉树完成。
Map和multimap拥有set和multiset的所有能力和所有操作函数。
Map和multimap与set和multiset的区别是:首先,map和multimap的元素时pair类型,其次map可作为关联式数组来运用。
创造value的三种方法:运用vaule_type,运用pair<>,运用make_pair()。
Non—const maps提供了下标操作,支持元素的直接存取。和一般数组的区别是:索引可以是任意型别的,而且如果你要使用某个key作为索引,而容器中尚未存放对应元素,那就会自动安插该元素。