《C++ Primer Plus》学习笔记10
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
第16章 string类和标准模板库
主要内容:
1)标准的C++string类
2)auto_ptr模板
3)标准模板库(STL)
4)容器类
5)迭代器
6)函数对象
7)STL算法
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1、string类
1)构造字符串
//初始化为常规的C-风格的字符串
string one ("Lottery Winner!");
//初始化为由20个$字符组成的字符串
string two(20, '$');
//复制构造函数将string对象three初始化为string对象one
string three(one);
//重载的+=操作符将字符串”Oops!“附加到字符串one的后面
one += “ Oops!“;
//+=操作符可以被多次加载,以便能够附加string对象和单个字符
one += two;
one += '! ';
//=操作符也可以被重载,以便可以将string对象、C――风格字符串或char值赋给string对
two = "Sorry! That was";
two = one;
two = ‘?’;
//+操作符创建了一个临时string对象,之后使用重载的=操作符将它赋给对象four
string four;
four = two + three;
//构造函数将一个C风格字符串和一个整数作为参数,其中的整数参数表示要复制多少个字符
char alls[] = "All's well that ends well";
string five(alls, 20);
//构造一个模板参数意味着包含begin不包含end在内的区间,记住最后一位指向的是后面的空格
template
string(Iter begin, Iter end); string six(alls + 6, alls + 10); string seven(&five[6], &five[10]);
2)string类输入
补充:
cin
1)输入一个数字
2)接受一个字符串,遇到空格、TAB、回车都结束
cin.get()
1)cin.get(ch)用来接收字符
char ch; cin.get(ch);
2)cin.get(s,n)用来接收一行字符串,可以接收空格 这个类似于getline 可以输入多个单词用空格隔开
char a[20]; cin.get(a,20);
cin.getline()
接受一个字符串,可以接收空格。这个和cin(s,n)都需要注意
char m[20] = jklkjilj;
cin.getline(m,5);
cout << m << endl; //这里输出结果为jklk 因为最后一个字符为‘0’
这就可以知道直接上cin.getline()有三个参数,接收字符串到m,接收个数,结束符(当省去的时候我们就默认为'\0'或者‘/n’)
char a[20]; cin.getline(a,5);
getline()
接收一个字符串,可以接收空格并输出,需要包含头文件#include
注意,getline()属于string流,所以只有把字符串定义为string型,我们才可以用,否则只能用istream流的cin.getline(m,20)
gets()
接收一个字符串,可以接收空格并输出,但是需要加上头文件#include
而且需要注意不能写成m = gets();应该为gets(m)
getchar()
接收一个字符,需要有头文件#include
这几需要注意,不能写成getchar(ch);应该写成ch = getchar(); getchar()是C语言的函数,C++也兼容,但是少用。
综上所述,根据我的习惯,C++以后碰到需要输入带空格的字符时用char ch; cin.get(ch)
字符串#include
gets(str)
3)使用字符串
string str1("cobra");
string str2("coral");
str1.length() == str2.size
确定字符的长度size()和length()成员函数都返回字符串中的字符数;length来自于较早版本的string类,size()则是为提供STL兼容性而添加的
find的四个版本 string::npos 是字符串可储存的最大字符数
①size_type find (const string &str, size_type pos = 0) const
从字符串的pos开始,查找子字符str。如果找到,则返回该子字符首次出现时其首字符的索引,否则返回string:: npos
②size_type find(const char *s, size_type pos = 0) const
从字符串的pos开始,查找子字符串s,如果找到,则返回该子字符首次出现时其首字符的索引,否则返回string:: npos
③size_type find(const char *s, size_type pos = 0, size_type n)
从字符串的pos位置开始,查找s的前n个字符组成的子字符串,如果找到,则返回该子字符串首次出现时其首字符的索引,否则返回string::npos
④size_type find(char ch, size_type pos=0) const
从字符串的pos位置开始,查找字符ch,如果找到,则返回该字符首次出现的位置,否则返回string::npos
4)string还提供了哪些功能
①自动调整大小的功能
每当程序将一个字符附加到字符串末尾时将发生什么呢?
不能仅仅将已有的字符串加大了,因为相邻的内存可能被占用了,因此可能需要一个新的内存块,并将原来的内容复制到新的内存单元中。
方法capacity()返回当前分配给字符串的内存块的大小,而reseve()方法让您能够请求内存块的最小长度
2、auto_ptr类
是一个模板类,用于管理动态内存分配的用法。
auto_ptr模板定义了类似指针的对象,可以将new获得(直接或者间接)的地址赋给这种对象,当auto_ptr对象过期时候,其析构函数将使用detele来释放内存,因此如果将new返回的地址赋给auto_ptr对象时,无须记住稍后释放这些内存,它过期之后,会自动释放。
*使用auto_ptr类注意事项:
1)记得要包含memory头文件#include
2)只能对new分配的内存使用auto_ptr对象,而不要对由new[]分配的或通过声明变量分配的内存使用它。
auto_ptr
pi (new int [200]); //No
3、STL
STL提供了一组表示容器、迭代器、函数对象、算法的模板。
容器是一个与数组类似的单元,可以存储若干个值;算法是完成特定任务的处方;迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;函数对象是类似于函数的对象,可以是类对象或函数指针
1)vector模板类
#include vetor
using namespace std;
vector
ratings(5);//5个整型的矢量 int n; cin >> n; vector
scores(n);//n个double的矢量 ratings[0] = 9; for(int i = 0; i < n; i++) cout << scores[i] << endl;
2)可对矢量执行的操作
size()――返回容器中元素的数目
swap()――交换两个容器的内容
begin()――返回一个指向容器中第一个元素的迭代器
end()――返回一个表示超过容器尾的迭代器