C++ Primer Plus 第十六章笔记

一、string

1.      构造函数:

注:npos为字符串的最大长度;NBTS表示以空字符结尾的字符串

2.      输入:

3.      使用字符串:

(1)      可以运用关系运算符比较字符串。

(2)      size() length() 成员函数返回字符串的字符数。

(3)      搜索字符串或字符:

(4)      capacity() 返回当前分配给字符串的内存块的大小;reverse() 可以请求内存块的最小长度。

(5)      c_str() 返回一个指向C-风格字符串的指针。

 

二、智能指针模板类

1.      三个智能指针模板(auto_ptrunique_ptrshared_ptr)都定义了类似指针的对象,可将new获得的地址赋给这种对象,当指针过期时,其析构函数将使用delete释放内存。

2.      创建智能指针对象需包含头文件memory

3.      所有智能指针都一个explicit构造函数,该构造函数将指针作为参数。

4.      当两个指针指向同一对象时:

(1)      定义赋值运算符。

(2)      建立所有权概念,使得对于特定对象只有一个智能指针可拥有它,这是用于auto_ptrunique_ptr的策略。

(3)      创建智能更高的指针跟踪引用特定对象的智能指针数,这是shared_ptr的策略。

5.      程序试图将一个unique_ptr赋给另一个时,如果源unique_ptr是个临时右值,编译器允许这样做,否则编译器将禁止这样做。

注:move() 函数允许将一个unique_ptr赋给另一个。

6.      使用new分配内存时,才能使用auto_ptrshared_ptr;不使用newnew[]分配内存时,不能使用unique_ptr

7.      选择智能指针:如果程序要使用多个指向同一个对象的指针,应选择shared_ptr;否则可使用unique_ptrauto_ptr(前者更好)。

8.      在unique_ptr为右值时,可将其赋给shared_ptr

 

三、模板类vector

1.      使用动态内存分配,可以用初始化参数指出需要多少矢量。

2.      基本方法:

(1)      size():返回容器中元素数目。

(2)      swap():交换两个容器内容。

(3)      begin():返回一个指向容器第一个元素的迭代器。

(4)      end():返回一个表示超尾的迭代器。

(5)      erase():接受两个迭代器,删除量迭代器区间的元素。

(6)      insert():接受三个迭代期,第一个为插入位置,第二、三为被插入区间。

 

四、STL(泛型编程)

1.      STL函数:

(1)      for_each()函数:接受三个参数,前两个是定义容器中区间的迭代期,最后一个是指向函数的指针即函数对象。该函数使被指向的函数应用于区间的每个元素,被指向的函数不能修改容器元素的值。

(2)      random_shuffle()函数:接受两个指定区间的迭代器参数,并随机排列该区间的元素。

(3)      sort()函数:第一个版本接受两个指定区间的迭代器参数,并按升序排列区间元素;第二个版本还接受第三个参数,该参数指定了要使用的函数指针。

(4)      copy()函数:前两个为要复制范围区间的迭代器(最好是输入迭代器),最后一个为复制到的位置的迭代器(最好是输出迭代器)。该函数不能自动根据发送值调整目标容器的长度,可通过三种插入迭代器解决问题:back_insert_iterator(将元素插入到容器尾),front_insert_iterator(插入到容器头),insert_iterator(插入到指定位置前)。

注意:如果容器元素是用户定义的对象,则要使用sort(),必须定义能够处理该类型对象的operator<()函数。

2.      迭代器类型:

(1)      输入迭代器:输入即来自容器的信息被视为输入,基于输入迭代器的任何算法都应该是单通行的,输入迭代器是单向迭代器,可以递增不可倒退。

(2)      输出迭代器:输出指用于将信息从程序传输给容器,其只是解除引用让程序修改容器值而不能读取。

(3)      正向迭代器:只使用++运算符来遍历容器,将正向迭代器递增后仍可以对前面的迭代器值解除引用。

(4)      双向迭代器:具有正向迭代器的所有特征,且支持前缀和后缀递减运算符。

(5)      随机访问迭代器:具有双向迭代器的所有特性,且支持随机访问操作,有用于对元素进行排序的关系运算符。

总结:对于单通行、只读算法,可以使用输入迭代器;对于单通行、只写算法,可以使用输出迭代器。

3.      迭代器是STL算法的接口,而指针是迭代器,因此STL算法可以使用指针来对基于指针的非STL容器进行操作。

4.      序列容器:

(1)      vector:是反转容器,在尾部添加和删除元素时间固定,但在头部或中间插入元素和删除元素复杂度为线性时间,其强调通过随机访问进行快速访问。一般默认使用这种类型。

(2)      deque:双端队列,在开始位置插入和删除元素的时间是固定的。如果多数操作发生在序列的起始和结尾处,则应考虑deque

(3)      list:双向链表,也是反转容器,在链表中任一位置进行插入和删除的时间都是固定的,不支数组表示法和随机访问。

(4)      forward_listC++11):单链表,不可反转的容器,相对list更简单但功能更少。

(5)      queue:其操作有:empty()(是否为空);size() (返回元素数目);front() (返回指向队首元素的引用);back() (返回指向队尾元素的引用);push(x) (在队尾插入x);pop() (删除队首元素)。

(6)      priority_queue:支持操作与queue相同,区别在于在priority_queue中最大元素被移到队首。

(7)      stack:其操作有:empty()(是否为空);size() (返回元素数目);top() (返回指向栈顶元素的引用);push(x) (在栈顶插入x);pop() (删除栈顶元素)。

(8)      array:并非STL容器,其长度固定。

5.      关联容器:

(1)      set:头文件set中定义,值与键类型相同,键是唯一的。

(2)      multiset:头文件set中定义,可能有多个值的键相同。

(3)      map:头文件map中定义,值与键类型不同,键是唯一的。

(4)      multimap:头文件map中定义,键不唯一。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值