首页 > 代码库 > C++ Primer Plus 第六版 第16章 string类和标准模板库
C++ Primer Plus 第六版 第16章 string类和标准模板库
1.string实际上是模板具体化basic_string<char> 的一个typedef,有默认参数,所以省略了初始化参数
2.size_type是一个依赖于实现的整形
string将string::npos定义为字符串的最大长度
3.string类的构造函数P656
4.对于c-风格字符串,3种输入方法:cin>> cin.getline(),cin.get
对于string ,2种输入方法:cin>>,getline(cin,string对象)
5.string的长度有两个方法得到
.length(),.size()
6.重载了4个find函数 P662
还有rfind,find_first_of,find_last_of,find_first_not_of,find_last_not_of
7.使用string的.c_str可以得到一个c-风格字符串
8.智能指针是一个对象,当对象过期时,让它的析构函数删除指向的内存。
这就是auto_ptr,unique_ptr,shared_ptr背后的思想。
9.声明智能指针
auto_ptr<double> pd(new double)
shared_ptr<double> pd(new double)
unique_ptr<double> pd(new double)
可以使用*,->运算符
10.智能指针应当指向堆内存
11.对于两个智能指针指向同一个内存空间,将会出现析构两次的问题。
针对这个问题,有三个解决方案:
一。进行深复制,产生新的副本
二、建立所有权概念,一旦一个智能指针赋给另一个,原来指针失去所有权,新指针获取,最终新指针析构。auto_ptr,unique_ptr就是这样实现的
三、使用引用计数,每当智能指针赋给另一个,则计数+1,当最后一个指针过期时,才调用delete,这是shared_ptr的做法
12.unique_ptr和auto_ptr的区别
程序试图将一个unique_ptr赋给另一个时,如果源unique_ptr是个临时右值,编译器允许,如果源unique_ptr将存在一段时间,将禁止这样做
auto是两种情况都可以。
例子:
auto_ptr<string> p1(new string("auto")); auto_ptr<string> p2; p2 = p1; 允许
unique_ptr<string> p3(new string("auto")); unique_ptr<string> p4; p4 = p3; 不允许,p3不是临时对象
临时对象一般发生在函数的返回值是一个智能指针,而且是一个临时对象
13.shared_ptr和auto_ptr只有new版本申请堆内存
而unique_ptr有new和new []两个版本。所以可以 std::unique_ptr<double[]> pda(new double(5));
14.通常使用shared_ptr,其次unique_ptr,最后auto_ptr
15.memory若没有shared_ptr和unique_ptr,则使用BOOST库
16.STL提供了一组表示容器,迭代器,函数对象和算法的模板
容器存储的值类型是相同的
算法是实现特定任务的处方
迭代器是能够遍历容器的对象,广义指针
函数对象时类似于函数的对象,包括类对象和函数指针
17.STL容器都有的基本方法
size()容器的元素数目;swap()交换两个容器的内容,begin()返回指向容容器第一个元素的迭代器;end()返回一个表示超过容器尾的迭代器
18.每种容器有一个合适的迭代器,类型是名为iterator的typedef
声明如:vector<double>::iterator pd
19.超过容器尾,类似于c-风格字符串后的空字符,表示容器最后元素的后面
20.push_back(),常用添加元素到容器的方法
erase()接受两个迭代器参数,用于删除给定区间中的元素 删除范围为[it1,it2),不包括it2
insert()接受3个参数,一个是插入位置的迭代器,后两个有迭代器组成的插入区间。会插入在插入位置的前面
21.STL定义了通用的非成员函数用于不同容器使用相同的函数
3个常用STL函数
for_each(),3个参数,前两个是迭代器区间,后面的是一个函数指针(函数对象)
random_shuffle(),接受两个迭代器区间,随机排列区间中的元素
sort()有两个版本
一、接受两个迭代器区间,对容器元素使用成员函数或非成员函数的operator<()进行比较,排序
二、接受3个参数,前两个是区间,最后一个是函数指针(函数对象),使用函数指针调用的函数比较,得到排序结果
22.C++11新增基于范围的for循环
for(double x: price) cout<<x<<endl;
进一步,使用auto自动类型识别,可以 for(auto x:price) cout<<x<<endl;
23.oop关注的是编程的数据方面,而泛型编程关注的是算法。它们之间的共同点是抽象和创建可重用代码
理解迭代器是理解STL的关键所在。模板使得算法独立于存储的数据类型。而迭代器使算法独立于使用的容器类型。因此,它们都是STL通用方法的重要组成部分
24.为重载区分++运算符的前缀和后缀版本,使用
operator++ 前缀版本
operator++(int)后缀版本
25.每个容器类定义了相应的迭代器类型,迭代器可能是指针,可能是对象。
迭代器能够: * ++等运算符
容器类:有begin()和end()方法,指向第一个元素和超尾位置的迭代器
26.输入迭代器:单通行,只读算法
输出迭代器;单通行,只写算法
正向迭代器:单通行,可读可写
双向迭代器:双通行,可++,-- ,可读可写
随机访问迭代器:可随机跳转到容器任何一个元素
描述迭代器功能的:P690
27.从以上迭代器来看,从概念上,有继承的关系。但是不能使用C++继承机制用于迭代器。
因为迭代器的实现多种多样。只是一种概念上的继承。
概念的具体实现称为模型
28、迭代器是广义指针。而指针满足所有迭代器要求
29.一些STL函数
sort()排序
copy()复制
30.一些有用的预定义迭代器
ostream_iterator,istream_iterator,reverse_iterator,back_insert_iterator,front_iterator,insert_iterator
P692
31.容器种类
容器概念是具有名称的通用类别:如容器,序列容器,关联容器
容器类型是可创建具体容器对象的模板;deque,list,queue,priority_queue,stack,vector,map,multimap,set,multiset,bitset
C++11新增:forward_list,unordered_map,unordered_multimap,unordered_multiset
容器概念指定了所有STL容器类都必须满足的一系列要求
容器是存储其他对象的对象。存储的对象必须是同一种类型的。容器过期,存储的也过期
存储的对象是可复制构造和可赋值的
32.容器的基本特征P695
33.序列sequence
序列要求元素按严格的线性顺序排列。序列的要求:P697
各种模板类的介绍P698-P701
关联容器,set,muitiset,map,multimap P702 - P706
无序关联容器
34.函数对象
也叫函数符。包括函数名,指向函数的指针和重载了()运算符的类对象(operator()()的类)
函数符的概念P708
预定义的函数符P710-P711
35.算法 P713-P720
STl的一些通用函数
将算法库分成4组:1.非修改式序列操作,2.修改式序列操作,3.排序和相关操作,4,通用数字运算
前三组在algorithm,最后在头文件numeric
16.10 看得我太恶心了 有时间再做