【Cpp 语言基础】 string 类型进阶使用
大纲:
1. 特殊的初始化方式
2. 获取子串
3. 与<algorith>中对应的成员函数
”串“类型类似于数组类型(C语言的字符串就是字符数组)。但是有一点不同之处,就是串经常作为一个整体才有实际的”意义“,而数组每个单元都有其”意义“。
因此,“串”的操作中,很大部分是“串”的整体、局部为单元,而非以个体为单元。
1. 特殊的初始化方式
除了采用以下传统的方式初始化,sting类型还有其他方式初始化:
string str1;
string str1(str2);
string str1(cstr);//cstr表示指向 C风格的字符串的指针
string str1("Hello world");
其他的初始化方式大多与子串有关。
string str1(cstr, len);//len为字符个数,而非C风格字符数组的下标. 范围[cstr, cstr+len]
//string str1(cstr, n, cnt); 没有这种表示方法
string str1(str2, pos);//pos为string元素的下标,范围是从pos开始的字符串
string str1(str2, pos, len);
string str1(str2, iter);//iter为string类型的迭代器,类似于vector<char>类型的迭代器,范围是从iter开始的字符串
string str1(str2, iter1, iter2);
2. 获取子串 str.substr()方法
可以利用 string 类的substr()方法来求取子串:
string str1 = str2.substr(n1, n2);
string str1 = str2.substr(n1);
这些操作类似于 C 语言的strcpy() 和 strncpy()
char * strcpy(char * strDest,const char * strSrc);
char *strncpy(char *dest, const char *src, int n),
3. 与<algorithm>中对应的成员函数
algorithm标准库中,有针对 vector类型的泛型算法,比如 find(), sort(), stable_sort() 等等函数,其基于迭代器。
但 string 类型的迭代器不常用,当用到算法的时候,string类型有其自己的一套“私人武器“。
比如 str.find()
,应用如下所示:
std::string myString = "Hello, world!";
size_t found = myString.find("Cat");
if (found == std::string::npos) {
std::cout << "Substring not found." << std::endl;
} else {
std::cout << "Substring found at position " << found << std::endl;
}
在上面的例子中,我们使用find()
函数查找子字符串"Cat"在myString
中的位置。如果子字符串不存在,则find()
函数返回std::string::npos
,我们可以使用它来判断子字符串是否存在于原字符串中。
扩展: 里面的 std::string::npos 是什么意思?
#include <iostream>
#include <string>
using namespace std;
int main()
{
//不能单独使用 npos,哪怕声明了 using namespace std;
//cout << "npos == " << npos <<endl; //编译出错:error: 'npos' was not declared in this scope
cout << "npos == " << string::npos <<endl; //输出为:npos == 4294967295
return 0;
}
std::string::npos
是C++标准库中string
类的静态成员变量,它表示一个无效的或者不存在的字符串位置或索引。这个值在string
类中通常用于查找或搜索某个子字符串或字符的位置,当find()
或rfind()
等函数无法找到所需的子字符串或字符时,它们会返回std::string::npos
作为标记表示查找失败。
std::string::npos
的值通常是一个非常大的整数,因为它需要能够区别于任何字符串中可能出现的有效位置或索引。具体的值可能因实现而异,但通常被定义为-1
或4294967295
(std::string::size_type
类型的最大值,通常为无符号整数类型)。
在使用find()
和rfind()
等函数时,我们通常使用std::string::npos
作为查找失败的返回值的标记。
应用:特定分割符分割字符串
比如分割以","为分隔符的一行文字,可以以下代码实现:
string linestr;
getline(cin, linestr);
int pos = 0;
while((pos = linestr.find(','))!=string::npos)
{
string substr(linestr, 0, pos);
cout << substr << endl;;
linestr.erase(0, pos+1);//删除已经显示的子串
}
cout << linestr <<endl;
/*
string 类型的erase一共三种用法:
erase(size_type pos=0, size_type n=npos):删除从下标pos开始的n个字符,比如erase(0,1)就是删除第一个字符(默认删除全部字符)
erase( std::iterator position):删除postion处的一个字符(position是一个string类型的迭代器)
erase(std::iterator first,std::iterator last):删除从first到last之间的字符(first和last都是迭代器)
*/