C++学习-Day-32

一、string类

string类的构造函数:

  1. string(const *s):将string对象初始化为s指向的一个空string;
  2. string(size_type n,char c):创建一个n个元素的string对象,每个元素初始化为c;
  3. string(const string & str):复制构造函数;
  4. string():创建一个默认的string对象,长度为0(默认构造函数);
  5. string(const char *s,size_type n):创建一个指向s的长度为n的对象,即时超过了s指向的对象;
  6. template string(Iter begin,Iter end):将string对象初始化为区间[begin,end]内的字符;
  7. string(const string & str,string size_typepos=0,size_type n=npos):讲一个string对象初始化为对象str中从位置pos开始的n个字符;
  8. string(string &&str)noexcept:这是C++11 新增的特性,它将一个string对象初始化为string对象str,并可能修改str(移动构造函数);
  9. string(initializer_listil):这是C++11新增的,它将一个string对象初始化为初始化列表il中的字符。

可以使用string对象的方法find()以不同方式在字符串中搜索给定的字符串或字符:

  1. size_type find(const string & str,size_type pos=0)const:从字符串的pos位置开始查找字符串str,如果找到则返回该字符串首次出现的首字符的索引,否则返回string::npos;
  2. size_type find(const char * s,size_type pos=0)const:从字符串的pos位置开始查找s指向的字符串,如果找到则返回该字符串首次出现的首字符的索引,否则返回string::npos;
  3. size_type find(const char * s,size_type pos=0,size_type n)const:从字符串的pos位置开始查找s指向的前n个字符,如果找到则返回该字符串首次出现的首字符的索引,否则返回string::npos;
  4. size_type find(char ch,size_type pos=0)const:从字符串的pos位置开始查找字符ch,如果找到则返回该字符串首次出现的首字符的索引,否则返回string::npos;

二、智能指针模板类

智能指针是行为类似普通指针的类对象,普通指针的使用有时会因为种种原因忘记释放内存,而智能指针能够调用其析构函数避免这种情况。这三个只能指针auto_ptr,unique_ptr,shared_ptr都定义了类似指针的对象。要创建智能指针需要包含头文件memory,然后使用模板定义语法来实例化所需要类型的指针:auto_ptr p(new typename),其它两种智能指针也有同样的语法。

每种智能指针都有其特点,为何要摒弃auto_ptr呢?当使用普通指针赋给另一个指针时,这两个指针会指向同一个对象,这会造成该对象被删除两次,这是不能接受的。要避免这种方式我们可以有多种方式:
1) 定义复制运算符,使其进行深度复制;
2) 建立所有权概念,对于特定的对象只能让一个指针指向它,auto_ptr和unique_ptr就是使用的这种策略;
3) 创建智能程度更高的指针,能跟踪特定对象的智能指针,称之为引用计数,赋值时让计数加1,指针过期时减1,仅当最后一个指针过期时才调用delete。
Unique_ptr为何会优于auto_ptr。虽然这两个都是用的所有权策略,但是unique_ptr更严格,如果程序试图将一个unique_ptr指针赋给另一个时,如果源指针是个临时右值,编译器允许这样做,如果源指针能够存在一段时间,则编译器会报错。相比于auto_ptr,unique_ptr还有一个优点,它有一个可用于数组的变体,new、delete,new[]、delete[]必须成对使用。

那么我们如何选择合适的智能指针呢?如果程序要使用多个指向同一个对象的指针,应选择shared_ptr。如果程序不需要使用多个指向同一个对象的指针,则可以使用unique_ptr。

三、标准模板库(STL)

STL提供了一组表示容器、迭代器、函数对象和算法的模板。
模板类vector。可以对矢量执行的操作,除了分配内存之外,STL还提供了一些基本方法包括size()、swap()(交换两个容器的内容)、begin()(返回一个指向容器中第一个元素的迭代器)、end()(返回一个表示超过容器尾的迭代器)。

什么是迭代器?它是一个广义的指针,我们可以通过将指针广义化为迭代器让STL能够为各种不同的容器类提供统一的接口。

下面介绍3个具有代表性的STL函数:

  1. for_each()函数:该函数接受3个参数,前2个参数是定义容器中区间的迭代器,最后一个参数是一个函数对象,该函数能够将函数对象应用于容器中某一区间的元素。
  2. random_shuffle():该函数接受2个指定区间的迭代器参数,并随机排列该区间中的元素。
  3. sort():该函数有两个版本,第一个版本接受2个定义区间的迭代器参数,对其中元素进行升序排列(该对象允许随机排序并定义了operator<(函数)),第二个版本接受3个参数,前两个一样为定义一个区间,最后一个参数为一个函数对象。

基于范围的for循环,该循环是为了用于STL而设计的其语法为:
for(typename x:iterator_name){};
typename为容器的数据类型,:iterator_name为容器名。基于范围的for循环可以依次访问容器类的数据并可以修改,而for_each()不行。

四、泛型编程

STL是一种泛型编程,面向对象编程关注的是数据方面,而泛型编程关注的是算法,它们的共同点是抽象和创建可重用代码,但是它们的理念完全不同。泛型编程旨在编写独立于数据类型的代码。

为何要使用迭代器?理解迭代器是理解STL的关键,模板使得算法独立于存储的数据类型,而迭代器使算法独立于容器类型。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值