每日复习笔记4.28

C++复习笔记

c++ primer笔记

顺序容器(一)

感觉这个部分真的是重难点啊,用好的真好用,用不好是,哎,我是菜鸡。
有一个顺序容器顺序容器适配器的概念,这里先写点关于顺序容器的吧。
常见的顺序容器有vectorlistdeque三种。

顺序容器的定义

所有的容易都是类模板,通过模板可以编写一个类定义,而用于多个不同的数据类型。

  1. 容器元素的初始化
表达式功能
C c;创建一个名为c的空容器。C为容器的类型,例如vector;T为容器中元素的类型,例如int,string。适用于所有容器
C c(c2);创建容器c2的副本;这里c和c2必须是相同的容器类型,并且存放着相同类型的元素适用于所有容器
C c(b,e);创建c,其元素是迭代器b和e标示的范围内元素的副本。适用于所有容器
C c(n,t);用n个值为t的元素创建容器c,其中值t必须是容器类型C的元素类型的值,或者可以转换为该类型的值。只适用于顺序容器
C c(n);创建n个值初始化元素的容器c。只适用于顺序容器

值初始化:如果指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化

将一个容器初始化为另一个容器的副本时,两者的容器类型数据类型都必须相同。但是,可以用一个容器的一部分元素初始化另一个容器。这种方式不要求容器类型相同,而且原容器的元素类型可以转换成目标容器的数据类型即可。不过这种方式需要利用迭代器间接的实现。

vector<string> svec;
list<string> slist(svec.begin(),svec.end());

vector<string>::iterator mid = svec.begin() + svec.size() / 2;
deque<string> front(svec.begin(),mid);
  1. 容器内元素的类型约束
    容器内的元素类型需要满足以下两个要求
    a)元素类型必须支持赋值操作。
    b)元素类型的对象必须可以复制。
    因此IO对象不能作为容器的数据类型,IO对象既不支持复制,也不支持赋值。
迭代器和迭代器范围

以下是标准库容器类型所提供的操作,这些操作时通用的。

表达式功能
*iter返回迭代器iter所指向的元素的引用
iter->mem对iter进行解引用,获取指定元素中名为mem的成员。等效于(*iter).mem
++iter或者iter++iter加1,使其指向容器里的下一个元素
- -iter或者iter- -iter减1,使其指向容器里的前一个元素
iter1 == iter2或iter1 != iter2比较两个迭代器是否相等或者不等。当两个迭代器指向同一个容器的同一个元素,或者当它们都指向同一个容器的超出末端的下一个位置时,两个迭代器相等

此外对于vector和deque容器的迭代器还有额外的操作。

表达式功能
iter + n iter - n在迭代器上加或者减整数值n,将产生指向容器中前面(后面)第n个元素的迭代器。新计算出来的迭代器必须指向容器中的元素或超出容器末端的下一个位置。
iter1 - iter2两个迭代器的减法(其运算结果加上右边的迭代器就可以得到左边的迭代器。)个人理解结果就是两个迭代器之间的距离。
>,>=,<,<=迭代器的关系操作符,当一个迭代器只想的元素在容器中位于另一个迭代器指向元素之前,则前一个迭代器小于后一个迭代器。关系操作符的两个迭代器必须指向同一个迭代器或者超出容器末尾的下一个位置。
  1. 迭代器范围
    C++语言使用一对迭代器标记迭代器范围,这两个迭代器分贝指向同一个容器的两个元素或者超出末端的下一个位置。通常命名为first和last,用于标记容器中一段元素的范围。左闭右开区间,表示这个范围从first开始,到last结束,但是不包括last。
    对于迭代器first和last有以下两个要求:
    a)他们指向同一个容器的元素或者超出末端的下一个位置
    b)如果两个迭代器不相等,则对first反复做自增运算必须能够到达last。换而言之,在容器中,last不能位于first之前。
    注意:编译器检查不出迭代器是否满足上述要求。如果不满足上述要求,将导致未知的运行时错误。

  2. 使迭代器失效的容器操作
    后面将会提到一些容器的操作会修改容器的内在状态或者移动容器中的元素。这样的操作会使所有指向被移动元素的迭代器失效,也可能使其他迭代器也失效。这样无效的迭代器会造成类似于悬垂指针的问题。

顺序容器的操作

每种顺序容器都提供了一下操作:
a)在容器中添加元素
b)在容器中删除元素
c)设置容器大小
d)(如果存在)获取容器内的第一个和最后一个元素

  1. begin成员和end成员
操作含义
c.begin()返回一个迭代器,它指向容器中的第一个元素
c.end()返回一个迭代器,它指向容器中的最后一个元素的下一个位置
c.rbegin()返回一个逆序迭代器,它指向容器中的最后一个元素
c.rend()返回一个逆序迭代器,它指向容器中的第一个元素前面的一个位置
  1. 在顺序容器中添加元素
操作含义
c.push_back()在容器c的尾部添加值为t的元素,返回void类型
c.push_front()在容器c的前端添加值为t的元素,返回void类型只适用于list和deque容器
c.insert(p,t)在迭代器p所指向的元素前面插入值为t的新元素。返回指向新添加的元素的迭代器。
c.insert(p,n,t)在迭代器p所指向的元素前面插入n个值为t的新元素。返回void类型
c.insert(p,b,e)在迭代器p所指向的元素前面插入由迭代器b和e标记的范围内的元素。返回void类型

注意:添加元素可能会是迭代器失效。
不要存储end操作返回的迭代器,因为任何添加或者删除deque和vector容器内元素都会使这个迭代器失效。

  1. 容器大小的操作
操作含义
c.size()返回容器c中的元素个数,返回类型为c::size_type
c.max_size()返回容器c可容纳的最多元素的个数,返回类型c::size_type
c.empty()返回标记的容器大小是否为0的bool值
c.resize(n)调整容器c的长度大小,使其能容纳n个元素。如果n<c.size(),则删除多出来的元素;否则,添加采用值初始化的新元素
c.resize(n,t)调整容器c的长度大小,使其能容纳n个元素,所有新添加的元素值都为t
  1. 访问元素
操作含义
c.back()返回容器c的最后一个元素的引用。
c.front()返回容器c的第一个元素的引用。
c.[n]返回下标为n的元素的引用(只适用于vector和deque容器)
c.at(n)返回下标为n的元素的引用(只适用于vector和deque容器)

使用越界的下标或者调用空容器的front或者back函数,都会造成程序严重的错误。

  1. 删除元素
操作含义
c.erase( p )删除迭代器p所指向的元素。返回一个迭代器,它指向被删除元素后面的元素。如果p指向容器内的最后一个元素,则返回迭代器指向容器的超出末端的下一个位置。
c.erase(b,e)删除迭代器b和e所标记的范围内所有的元素。返回一个迭代器,它指向被删除元素段后面的元素。如果e指向容器内的最后一个元素,则返回迭代器指向容器的超出末端的下一个位置。
c.clear()删除容器c内的所有元素。返回void类型
c.pop_back()删除容器c的最后一个元素。返回void类型
c.pop_front()删除容器c的第一个元素。返回void类型(只适用于list和deque类型)

erase、pop_front和pop_back函数使指向被删除元素的所有迭代器失效。对于vector容器,指向删除点后面的元素的迭代器通常也会失效。而对于deque容器,如果删除时不包含第一个元素和最后一个元素,那么该deque容器相关的所有迭代器都会失效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值