C++标准库

十年热恋 提交于 2020-03-06 09:57:18

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作为索引,而容器中尚未存放对应元素,那就会自动安插该元素。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!