C++第16章 string类和标准模版库(智能指针、STL、迭代器)

16.1 string类

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(string类的输入,char往往需要添加字符个数条件,而string版本的getline()将自动调整目标string对象的大小)
在这里插入图片描述
在这里插入图片描述

16.2 智能指针模版类

原始指针如果忘记删除,或者删除的情况没有考虑清楚,容易造成悬挂指针(dangling pointer)或者说野指针(wild pointer)。
智能指针是行为类似于指针的类对象,new获得的地址将赋予给这种对象。当智能指针过期时,其析构函数使用delete来释放内存。创建智能指针必须包含头文件memory。
所有智能指针类都有一个explicit构造函数,该构造函数将指针作为参数。
在c++中,智能指针一共定义了4种:
auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中,auto_ptr 在 C++11已被摒弃,在C++17中已经移除不可用。
在这里插入图片描述
在这里插入图片描述
(模版auto_ptr的构造函数)
共享的智能指针shared_ptr:共享智能指针是指多个智能指针可以同时管理同一块有效的内存,共享智能指针对象初始化完毕之后就指向了要管理的那块堆内存,如果想要查看当前有多少个智能指针同时管理着这块内存可以使用共享智能指针提供的一个成员函数use_count。
初始化:shared_ptr ptr1(指针地址);

void f2() {
    shared_ptr<int> p = make_shared<int>(1);
    shared_ptr<int> p2(p);
    shared_ptr<int> p3 = p;
}

独占的智能指针unique_ptr:是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针,可以通过它的构造函数初始化一个独占智能指针对象,但是不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr。
unique_ptr p(new int(5));

弱引用的智能指针weak_ptr:weak_ptr可以看做是shared_ptr的助手,它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和->,因为它不共享指针,不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数,它的主要作用就是作为一个旁观者监视shared_ptr中管理的资源是否存在。

16.3 标准模版库

STL提供了一组表示容器、迭代器、函数对象和算法的模版。
模版类vector:
在这里插入图片描述
size()返回容器中元素数目
swap()交换两个容器的内容
begin()返回一个指向容器中第一个元素的迭代器
end()返回一个表示超过容器尾的迭代器,指向容器最后一个元素后面的那个元素。
push_back()将元素添加到矢量末尾
erase()删除矢量中给定区间的元素,它接受两个迭代器参数,这些参数定义了要删除的区间,第一个迭代器指向区间的起始处,第二个迭代器位于区间终止处的后一个位置。[it1,it2)
insert()与erase()相反,它接受3个迭代器参数,第一个参数指定类新元素的插入位置,第二个和第三个迭代器参数定义了被插入区间,该区间通常是另一个容器对象的一部分。
for_each()将被指向的函数应用于容器区间中的各个元素。接受3个参数,前两个参数定义容器中区间的迭代器,最后一个是指向函数的指针。
random_shuffle()接受两个指定区间的迭代参数,并随机排列该区间中的元素。
sort()接受两个定义区间的迭代器参数,并使用为存储在容器中的类型元素定义的<运算符,对区间中的元素进行操作(排序)
copy() 将数据从一个容器复制到另一个容器中。前两个迭代器参数表示要复制的范围,最后一个迭代器参数表示要将第一个元素复制到什么位置。
迭代器:广义的指针,可以是指针也可以是一个可对其执行类似指针的操作的对象(看成是指针)。

16.4 泛型编程

泛型编程旨在编写独立于数据类型的代码,STL就是一种泛型编码。
模版使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输入迭代器:输入迭代器可被程序用来读取容器中的信息,但不会修改容器中的值。
输出迭代器:将信息从程序传输给容器的迭代器,只能修改容器值但不能读取。
正向迭代器:它总是按相同的顺序遍历一系列值,可以使得能够读取和修改数据,也可以使得只能读取数据。
双向迭代器:具有正向迭代器所有特性,同时支持两种(前缀和后缀)递减运算符。
随机访问迭代器:能够直接跳到容器中的任何一个元素。具有双向迭代器的所有特性,同时添加了支持随机访问的操作和用于对元素进行排序的关系运算符。
在这里插入图片描述
在这里插入图片描述

将指针用作迭代器:
指针满足所有的迭代器要求。迭代器是STL算法的接口,而指针是迭代器,因此STL算法可以使用指针来对基于指针的非STL容器进行操作。也就是可以将迭代器的相关算法应用于非STL容器之中,只不过迭代器需要用指针表示,如数组。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其他迭代器:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

STL具有容器概念和容器类型。概念是具有名称(如容器、序列容器、关联容器等)的通用类别;容器类型是可用于创建具体容器对象的模版。
容器概念:描述了所有容器类都通用的元素,容器概念指定了所有STL容器类都必须满足的一系列要求。
容器是存储其他对象的对象,被存储的对象必须是同一种类型,类型必须是可复制构造的和可赋值的。
在这里插入图片描述
若复杂度为编译时间,则操作将在编译时执行,执行时间为0.固定复杂度意味着操作发生在运行阶段,但独立于对象中的元素数目。线性复杂度意味着时间于元素数目成正比。

序列中的元素具有确定的顺序,其元素按严格的线性顺序排列,即存在第一个元素、最后一个元素,除第一个元素和最后一个元素外,每个元素前后都分别有一个元素(deque/forward_list/list/queue/priority_queue/stack/vector)
在这里插入图片描述

vector:是数组的一种类表示,它提供类自动内存管理功能,可以动态地改变vector对象的长度,并随着元素的添加和删除而增大和缩小。它提供了对元素的随机访问。在尾部添加和删除元素的时间是固定的,但在头部或中间插入和删除元素的复杂度为线性时间。
deque:双端队列。从deque对象的开始位置插入和删除元素的时间是固定的。
list:双向链表。除了第一个和最后一个元素外,每个元素都与前后的元素向链接。list在链表中任一位置进行插入和删除的时间都是固定的。
在这里插入图片描述
forward_list(C++11):单链表,每个节点都只链接到下一个节点,而没有链接到前一个节点。
queue:队列。添加元素到队尾,从队首删除元素。
在这里插入图片描述
priority_queue:它支持的操作与queue相同。在priority_queue中,最大的元素被移到队首。
stack:将压入推到栈顶,从栈顶弹出元素
在这里插入图片描述

关联容器:关联容器将值与键关联在一起,并使用键来查找值。(set/multiset/map/multimap)
关联容器的优点在于,它提供来对元素的快速访问。与序列相似,关联容器也允许插入新元素,但不能指定元素的插入位置。
set其值类型与键相同,键是唯一,这意味着集合中不会有多个相同的键。multiset类似于set,只是可能有多个值的键相同。
set就是集合,STL的set用二叉树实现,集合中的每个元素只出现一次(参照数学中集合的互斥性),并且是排好序的(默认按键值升序排列)
set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许
在这里插入图片描述

set<int> q;     //以int型为例 默认按键值升序
set<int,greater<int>> p;  //降序排列 
int x;
q.insert(x);	//将x插入q中
q.erase(x);		//删除q中的x元素,返回0或1,0表示set中不存在x
q.clear();		//清空q
q.empty();		//判断q是否为空,若是返回1,否则返回0
q.size();		//返回q中元素的个数
q.find(x);		//在q中查找x,返回x的迭代器,若x不存在,则返回指向q尾部的迭代器即 q.end()
q.lower_bound(x); //返回一个迭代器,指向第一个键值不小于x的元素
q.upper_bound(x); //返回一个迭代器,指向第一个键值大于x的元素

q.rend();		  //返回第一个元素的的前一个元素迭代器
q.begin();		  //返回指向q中第一个元素的迭代器

q.end();		 //返回指向q最后一个元素下一个位置的迭代器
q.rbegin();		 //返回最后一个元素

map其值与键的类型不同,键是唯一,每个键对应一个值。multimap类似于map,只是一个键可以与多个值相关联。

* 使用multimap必须使用宏语句#include <map>          
 *
 **************************************************************************************
 *
 * 创建multimap对象:
 * 1.multimap<char,int,greater<char> > a;    //元素键值类型为char,映照数据类型为int,键值的比较函数对象为greater<char>
 * 2.multimap(const key_compare& comp)     //指定一个比较函数对象comp来创建map对象
 *  3.multimap(const multisetr&);      //multimap<int,char*> b(a); //此时使用默认的键值比较函数less<int>
 * 4.multimap(first,last);         
 * 5.multimap(first,last,const key_compare& comp);  
 *
 * //Example:
 * pair<const int ,char> p1(1,'a');
 * pair<const int ,char> p2(2,'b');
 * pair<const int ,char> p3(3,'c');
 * pair<const int ,char> p4(4,'d');
 * pair<const int ,char> pairArray[]={p1,p2,p3,p4};
 * multimap<const int,char> m4(pairArray,pairArray+5);
 * multimap<const int,char> m3(m4);
 * multimap<const int,char,greater<const int> > m5(pairArray,pairArray+5,greater<const int>());
 *
 **************************************************************************************
 *
 * 元素的插入
 * //typedef pair<const key,T> value_type;
 * pair<iterator,bool> insert(const value_type& v);    
 * iterator insert(iterator pos,const value_type& v);
 * void insert(first,last);
 *
 **************************************************************************************
 *
 * 元素的删除
 * void erase(iterator pos);
 * size_type erase(const key_type& k);     //删除等于键值k的元素
 * void erase(first,last);        //删除[first,last)区间的元素
 * void clear();
 *
 **************************************************************************************

在这里插入图片描述

16.5 函数对象(函数符)

函数符是可以以函数方式与()结合使用的任意对象。(和函数差不多)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.6 算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值