C++Primer笔记(3)

时间:2023-03-09 15:20:26
C++Primer笔记(3)

标准库类型string表示可变长的字符序列,使用前先包含string头文件。(哈哈,终于可以扔掉C语言中的str函数)因为是标准库的一部分,所以string被定义在命名空间std中。所以你懂该怎么做(参见这儿)。

在stl_string_fwd.h中找到如下语句:

typedef basic_string<char>    string;

basic_string是一个模板类,在string中有定义。可以看出string是对char类型的一个封装,未对其进行深挖,所以本次笔记只做为string操作手册使用。

初始化string对象的方式:

string s1;              //默认初始化,s1为空串
string s2(s1); //s2是s1的副本
string s2 = s1; //等价于上一行
string s3("test"); //s3是字面值"test"的副本,除了最后的空字符外
string s3 = "test"; //等价于上一行
string s4(n, 'c'); //s4被初始化为n个'c'组成的字符串
string s5(cp, n); //s5是cp指向的字符串数组中前n个字符的拷贝。此数组至少应该包含n个字符
string s6(s5, n); //s6是s5从下标n开始的字符的拷贝。若s5.size()<n,则构造函数行为未定义
string s6(s5, n, m); //s6是s5从下标n开始m个字符的拷贝。若s5.size()<n,则构造函数行为未定义。不管m值是多少,构造函数至多拷贝s5.size() - n个字符

string对象上的操作:

os << s            将s写到输入流os当中,返回os
is >> s 从is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is, s) 从is中读取一行赋给s,返回is
s.empty() 判断s是否为空,为空返回true,否则返回false
s.size() 返回s中字符的个数
s[n] 返回s中第n个字符的引用,位置n从0开始
s1 + s2 返回s1、s2拼接后的内容
s1 = s2 用s2的副本代替s1中内容
s1 == s2    判断s1、s2是否相等
s1 != s2 是否不相等
<,<=,>,>= 利用字符在字典中的顺序进行比较,从首个字符开始向后依次比较,一有结果立刻返回。

插入

s.insert(pos, args);    //在pos之前插入args指定的字符。pos可以是一个下标或者迭代器。接受下标的版本返回一个指向s的引用,接受迭代器的版本返回指向第一个插入字符的迭代器。

删除

s.erase(pos, len);    //删除从位置pos开始的len个字符。如果len被省略,则删除从pos开始直至s末尾的所有字符。返回一个指向s的引用

替换

s.assign(args);    //将s中的字符替换为args指定的字符。返回一个指向s的引用
s.replace(n, m, args); //删除从下标n开始m个字符或删除迭代器n和m表示的范围中的字符,替换为args指定的字符。

追加

s.append(args);    //将args中的字符追加到s中,返回一个指向s的引用

子字符串操作

s.substr(pos, n);    //返回一个string,包含s中从pos开始的n个字符的拷贝。pos的默认值是0,n的默认值是s.size() - pos,即拷贝从pos开始的所有字符

搜索

s.find(args);                //查找s中args第一次出现的位置
s.rfind(args); //查找s中args最后一次出现的位置
s.find_first_of(args); //在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args); //在s中查找args中任何一个字符最后一次出现的位置
s.find_first_not_of(args); //在s中查找第一个不在args中的字符
s.find_last_not_of(args); //在s中查找最后一个不在args中的字符

比较

s.compare(s1);                         //比较string s和s1
s1.compare(pos1, n1, s2); //将s1中从pos1开始的n1个字符与s2进行比较
s1.compare(pos1, n1, s2, pos2, n2); //将s中从pos1开始的n1个字符与s2中从pos2开始的n2个字符串进行比较
s.compare(cp); //比较s和cp指向的以空字符结尾的字符串数组
s1.compare(pos1, n1, cp); //将s1和从pos1开始的n1个字符与cp指向的以空字符结尾的字符串数组比较
s1.compare(pos1, n1, cp, n2); //将s1和从pos1开始的n1个字符与指针cp指向的地址开始的n2个字符进行比较

string和数值之间的转换

to_string(var);    //返回数值val的string表示。val可以是任意算术类型

/*返回s的起始子串的数值*/
stoi(s, p, b); //返回int型
stol(s, p, b); //返回long型
stoul(s, p, b); //返回unsigned long型
stoll(s, p, b); //返回long long型
stoull(s, p, b); //返回unsigned long long型
stof(s, p, b); //返回float型
stod(s, p, b); //返回double型
stold(s, p, b); //返回long double型
/*其中p为size_t类型的指针,用来存放第一个非数值字符的下标,默认为0*/
/*b表示进制,默认为10*/

此处应注意在string转数值时,所提供的string中第一个非空白字符必须是数值中可能出现的字符!