C++ Primer Plus Chapter 16
Chapter16 string类和标准模板库
string类
-
string的构造函数:
- string( const char *s )
-
string( size_type n, char c)
创建一个包含n个元素的string对象,其中每个元素都被初始化为字符c
- string( const string &str)
- string( )
- string( const char*s, size_type n)
-
template
string( Iter begin, Iter end) string six( alls+6, alls+10);
即从字符串6-9四个数,不包括alls[10]
-
string( const string &str, string size_type pos=0, size_type n=npos )
string eight( four, 7, 16)
从four的第8个字符,位置为7开始,将16个字符复制到eight中
-
string对象,有两种输入方式:
- cin » stuff;
- getline( cin, stuff );
C-风格字符串,有三种输入方式:
- cin » info;
- cin.getline( info, 100);
- cin.get( info, 100);
getline可指定哪个字符为输入边界:
- cin.getline( info, 100, ‘:’ ); //读取直到:,丢弃:
- getline( stuff, ‘:’ );
-
size()和length()成员函数都返回字符串中的字符数,而length()来自较早版本的string类,size()则是为提供STL兼容性而添加的
-
find()在字符串中搜索给定的子字符串或字符
- size_type find(const sring &str, size_type pos=0) //返回子字符串首次出现时,其首字符的索引;否则,返回string::npos
- size_type find(const char *s, size_type pos=0) //返回子字符串首次出现时,其首字符的索引
- size_type find(const char *s, size_type pos=0, size_type n) //返回子字符串首次出现时,其首字符的索引
- size_type find(char ch, size_type pos=0) //返回该字符首次出现的位置
string库还提供了相关方法,rfing(),find_first_of(),find_last_of()和find_first_not_of()
-
c_str()将用string对象返回指向C字符串的指针
智能指针模板类
-
智能指针是行为类似于指针的类对象,但这种对象还有其他功能
- auto_ptr
- unique_ptr
- shared_ptr
auto_ptr已经不常使用了,unique_ptr和shared_ptr最常使用
可将new获得的地址赋给这种类似指针的对象。当智能指针过期时,其析构函数将使用delete来释放内存,即内存自动被释放
void demol() { double *pd = new double; *pd=25.5; return; }
pd变量被释放,但是pd所指向的内存地址,没有被释放
void demol() { auto_ptr<double> ap(new double); *ap=25.5; return; }
-
要创建智能指针对象,必须包含头文件memery,该文件模板定义,然后使用通常的模板语法来实话所需类型的指针
#include<memory> auto_ptr<string> ps (new string("test"));
-
throw()表示函数不会引起异常,所以在使用的时候,不必通过try/catch处理
-
由于智能指针模板类的定义方式,智能指针对象的很多方面都类似于常规指针。
-
当两个智能指针指向同一个string对象时,必须处理,否则程序将试图删除同一个对象两次:
- 定义复制运算符
- auto_ptr和unique_ptr,通过所有权ownership,对于特定对象,只能有一个智能指针可拥有
- shared_ptr,跟踪引用特定对象的智能指针数,即引用计数
另外:
- 使用new分配内存时,才能使用auto_ptr和shared_ptr;
- 使用new[]分配内存时,不能使用auto_ptr和shared_ptr;
- 不使用new分配内存时,不能使用auto_ptr和shared_ptr;
- 不使用new或new[]分配内存时,不能使用unique_ptr;
- 即auto_prt只有new;unique_prt有new和new[];shared_ptr只有new
-
选择智能指针:
- 要使用多个指向同一个对象的指针,选shared_ptr:指针数组,使用辅助指针来标识特定元素;两个对象包含都指向第三个对象的指针;STL容器包含指针
- 程序不需要多个指向同一个对象的指针,可使用unique_ptr:如果函数使用new分配内存,并返回指向该内存的指针;
标准模板库
-
STL(Standard Template Library)提供了一组表示容器、迭代器、函数对象和算法的模板。
容器是与数组类似的单元,可以存储若干值:
- STL容器是同质的,储存的值类型相同
- 算法是完成特定任务
- 迭代器能够用来遍历容器的对象,与遍历数组的指针类似,是广义指针
- 函数对象是类似与函数的对象,可以是类对象或函数指针
-
vector:vector模板使用动态内存分配,可用初始化参数来指出需要多少矢量
cin >> n; vector<double> scores(n);
-
STL容器基本方法:
- size() 返回容器中元素数目
- swap() 交换两个容器的内容
- begin() 返回一个指向容器中第一个元素的迭代器
- end() 返回一个表示超过容器尾的迭代器,标识超过结尾的位置
迭代器是一个广义指针,其也可以是一个可对其执行类似指针的操作的对象。通过将指针广义化为迭代器,让STL能够为各种不同的容器类提供统一的接口。每个容器类都定义了一个合适的迭代器,迭代器的类型是名为iterator的typedef,作用域为整个类。声明迭代器:
vector<double>::iterator pd;
- push_back()将元素添加到矢量末尾
- erase()删除矢量中给定区间的元素,接受两个迭代器参数,第一个迭代器指向区间的起始处,第二个位于区间终止处的后一个位置
- insert插入区间元素,接受三个迭代器参数,第一个参数指定了新元素插入位置,第二个和第三个迭代器参数定义了被插入区间
-
for_each(),接受3个参数,前两个是容器中区间的迭代器,最后一个是指向函数的指针(函数对象)
for_each(books.begin(), books.end(), ShowReview)
-
random_shuffle()函数接受2个指定区间的迭代器参数,并随机排列该区间中的元素
random_shuffle( books.begin(), books.end() );
-
sort()函数将容器中的类型元素升序排列
sort(books.begin(), books.end() ); sort(books.begin(), books.end(), WorseThan );
泛型编程
-
泛型编程关注算法,面向对象编程关注的是编程的数据方面。泛型编程,是编写独立于数据类型的代码。
-
模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型。
-
每个容器类定义了相应的迭代器类型,对于其中的某个类,迭代器可能为指针;对另一个类,则可能是对象,无论如何实现,迭代器都将提供所需操作;每个容器类都有一个超尾标记,迭代器超越容器的最后一个值后,这个值江北赋给迭代器。
-
**作为一种编程风格,最好避免直接使用迭代器,应尽可能使用STL函数
-
定义满足算法需求的迭代器,使通用算法能够适用于具体情况,而不是局限于数据结构
-
迭代器类型:
- 输入迭代器
- 输出迭代器
- 正向迭代器
- 双向迭代器
- 随机访问迭代器