文章目录
-
- 测试环境
- string类介绍
- 头文件
- 模块类定义
- 对象构造
- 容量
- 元素访问
- 字符串比较
- 迭代器
- 插入和删除
- 替换和子字符串
- 字符串查找
- 数值转字符串
- 字符串转数值
测试环境
系统:ubuntu 22.04.2 LTS 64位
gcc版本:11.3.0
编辑器:VSCode 1.76.2
string类介绍
string类是basic_string模板类对char类型的特化,封装了常用的字符串操作,如初始化、遍历、查找、拼接、比较、替换等功能。
头文件
#include
模块类定义
std::basic_string<char> std::string;
对象构造
std::string str1;
std::string str2 = "hello world";
std::string str3("hello world");
std::string str4(6,'a');
std::string str5(str2);
std::string str6(std::move(str4));
std::string str7(str2, 6, 5);
容量
函数名 |
返回值 |
功能 |
empty() |
布尔值 |
判断字符串是否为空 |
size() |
字符串大小 |
获取字符串长度 |
length() |
字符串实际占用长度 |
获取字符串长度 |
max_size() |
字符串对象最大容量 |
获取字符串对象最大容量 |
capacity() |
字符串当前容量 |
获取字符串当前容量,一般比字符串实际长度大 |
shrink_to_fit() |
无 |
释放字符串对象为使用的空间 |
reserve() |
无 |
设置字符串保留存储大小 |
std::string strTest1;
std::cout << std::boolalpha << strTest1.empty() << std::endl;
strTest1 = "hello world";
std::cout << "size=" << strTest1.size() << ",length=" << strTest1.length() << std::endl;
std::cout << "max_size=" << strTest1.max_size() << std::endl;
std::cout << "capacity=" << strTest1.capacity() << std::endl;
strTest1.shrink_to_fit();
std::cout << "capacity=" << strTest1.capacity() << std::endl;
strTest1.reserve(100);
std::cout << "capacity=" << strTest1.capacity() << std::endl;
元素访问
函数名 |
返回值 |
功能 |
[] |
指定元素的值 |
访问元素 |
at() |
指定元素的引用 |
访问元素 |
front() |
首元素的引用 |
获取首元素 |
back() |
元素的引用 |
获取末尾元素 |
data() |
首元素的地址 |
获取指向首元素的指针 |
for (int i = 0; i < 10; i++)
{
std::cout<< arrInt[i] << " ";
}
for (int i = 0; i < 10; i++)
{
std::cout << arrInt.at(i) << " ";
}
std::cout << arrInt.front() << " " << arrInt.back() << std::endl;
int *p = arrInt.data();
注:front()和back()不能用于获取0长度数组的元素。
字符串比较
函数 |
返回值 |
功能 |
== |
bool |
判断array是否为空,为空返回true,不为空返回false |
compare() |
相等时返回0,小于时返回负数,大于时返回正数 |
比较两个字符串大小 |
starts_with() |
布尔值 |
判断字符串是否以指定子字符串开头 |
ends_with() |
布尔值 |
判断字符串是否以指定子字符串结尾 |
std::string strCompare1("hello world");
std::string strCompare2("hellO world");
std::cout << std::boolalpha << (strCompare1 == strCompare2) << std::endl;
std::cout << strCompare1.compare(strCompare2) << std::endl;
迭代器
类型 |
功能 |
iterator |
正向随机访问迭代器。从前向后访问元素,可以读取也可以修改 |
const_iterator |
常量正向随机访问迭代器。从前向后访问元素,只能读取不能修改 |
reverse_iterator |
逆向随机访问迭代器。从后向前访问元素,可以读取也可以修改 |
const_reverse_iterator |
常量逆向随机访问迭代器。从后向前访问元素,只能读取不能修改 |
函数 |
返回值 |
功能 |
begin() |
正向随机访问迭代器 |
返回指向string对象首元素所在位置的迭代器 |
end() |
正向随机访问迭代器 |
返回指向string对象末尾元素的下一个位置的迭代器 |
cbegin() |
常量正向随机访问迭代器 |
返回指向string对象首元素所在位置的常量迭代器 |
cend() |
常量正向随机访问迭代器 |
返回指向string对象末尾元素的下一个位置的迭代器 |
rbegin() |
逆向随机访问迭代器 |
返回指向string对象末尾元素位置的迭代器 |
rend() |
逆向随机访问迭代器 |
返回指向string对象首元素的前一个位置的迭代器 |
crbegin() |
常量逆向随机访问迭代器 |
返回指向string对象末尾元素位置的常量迭代器 |
crend() |
常量逆向随机访问迭代器 |
返回指向string对象首元素的前一个位置的常量迭代器 |
std::string strTest2 = "hello world";
std::string::iterator itr;
for (itr = strTest2.begin(); itr != strTest2.end(); itr++)
{
*itr += 1;
std::cout << *itr << " ";
}
std::string::const_iterator cItr;
for (cItr = strTest2.cbegin(); cItr != strTest2.cend(); cItr++)
{
std::cout << *cItr << " ";
}
std::string strTest3 = "welcome china";
std::string::reverse_iterator rItr;
for (rItr= strTest3.rbegin(); rItr!= strTest3.rend(); rItr++)
{
*rItr += 1;
std::cout << *rItr << " ";
}
std::string::const_reverse_iterator crItr;
for (crItr= strTest3.crbegin(); crItr!= strTest3.crend(); crItr++)
{
std::cout << *crItr << " ";
}
插入和删除
函数 |
返回值 |
功能 |
push_back() |
无 |
字符串末尾插入字符 |
pop_back() |
无 |
删除字符串末尾字符 |
append() |
字符串引用 |
字符串末尾追加字符或字符串 |
insert() |
字符串引用 |
字符串中插入字符或字符串 |
erase() |
字符串引用或迭代器 |
删除字符串中字符或子字符串 |
clear() |
无 |
清空字符串中的内容 |
std::string strTest4("hello world");
std::string strTest5("hello world!");
strTest5.push_back('A');
std::cout << strTest5 << std::endl;
strTest5.pop_back();
std::cout << strTest5 << std::endl;
strTest5.append(" ").append(4, 'A');
std::cout << strTest5 << std::endl;
strTest5.append(" ").append(strTest4);
std::cout << strTest5 << std::endl;
const char *pStr = "append";
strTest5.append(" ").append(pStr, 4);
std::cout << strTest5 << std::endl;
std::string tmpStr("tempstr");
strTest5.append(" ").append(tmpStr.begin() + 1, tmpStr.end());
std::cout << strTest5 << std::endl;
strTest5.append(" ").append({'i', 'n','i','t'});
std::cout << strTest5 << std::endl;
std::string strTest6("china");
strTest6.insert(1,1,'A');
std::cout << strTest6 << std::endl;
strTest6.insert(0,"welcome ");
std::cout << strTest6 << std::endl;
std::string strTemp(" temp ");
strTest6.insert(0, strTemp);
std::cout << strTest6 << std::endl;
std::string strTemp1("zhongguo");
strTest6.insert(strTest6.begin()+3, strTemp1.begin()+5, strTemp1.end());
std::cout << strTest6 << std::endl;
strTest6.insert(0, {'A','B','C'});
std::cout << strTest6 << std::endl;
strTest6.erase(0, 3);
std::cout << strTest6 << std::endl;
strTest6.erase(strTest6.begin());
std::cout << strTest6 << std::endl;
strTest6.erase(strTest6.begin()+1, strTest6.begin()+5);
std::cout << strTest6 << std::endl;
strTest6.clear();
std::cout << strTest6 << std::endl;
替换和子字符串
函数 |
返回值 |
功能 |
replace() |
字符串引用 |
替换字符或子字符串 |
substr() |
子字符串对象 |
获取子字符串 |
std::string strTest7("hello this is an example");
strTest7.replace(6,4, std::string("ABC"));
std::cout << strTest7 << std::endl;
strTest7.replace(strTest7.begin()+6, strTest7.begin()+9, "this");
std::cout << strTest7 << std::endl;
strTest7.replace(6, 4, 5, 'X');
std::cout << strTest7 << std::endl;
std::string strTemp2("this");
strTest7.replace(strTest7.begin()+6, strTest7.begin()+11, strTemp2.begin(), strTemp2.end());
std::cout << strTest7 << std::endl;
strTest7.replace(strTest7.begin()+6, strTest7.begin()+10, {'T', 'H', 'I', 'S'});
std::cout << strTest7 << std::endl;
std::cout << strTest7.substr(6, 4) << std::endl;
std::cout << strTest7.substr(6, 30) << std::endl;
字符串查找
函数 |
返回值 |
功能 |
find() |
字符串索引值 |
正向查找目标字符串或字符在原字符串中的位置 |
rfind() |
字符串索引值 |
反向查找目标字符串或字符在原字符串中的位置 |
find_first_of() |
字符索引值 |
正向查找目标字符串中字符在原字符串中首次出现的位置 |
find_last_of() |
字符索引值 |
反向查找目标字符串中字符在原字符串中首次出现的位置 |
find_first_not_of() |
字符索引值 |
正向查找不在目标字符串中的字符在原字符串中首次出现的位置 |
find_last_not_of() |
字符索引值 |
反向查找不在目标字符串中的字符在原字符串中首次出现的位置 |
注意:字符串查找时如果没有找到目标字符串,那么会返回std::string::npos值,可以使用此值判断是否有找到目标字符串或字符。
std::string strTest8("this is an example!");
std::cout << strTest8.find("an") << std::endl;
std::cout << strTest8.find("an", 4) << std::endl;
std::cout << strTest8.find("xamp", 4, 3) << std::endl;
std::cout << strTest8.find("ex", 4, 2) << std::endl;
std::cout << strTest8.find('h') << std::endl;
std::cout << strTest8.find('p',10) << std::endl;
std::cout << strTest8.rfind("an") << std::endl;
std::cout << strTest8.rfind("an", strTest8.length()-8) << std::endl;
std::cout << strTest8.rfind("ex", strTest8.length()-2, 2) << std::endl;
std::cout << strTest8.rfind("ex", strTest8.length()-8, 2) << std::endl;
std::cout << strTest8.rfind('h') << std::endl;
std::cout << strTest8.rfind('p',strTest8.length()-2) << std::endl;
std::cout << strTest8.find_first_of("mx") << std::endl;
std::cout << strTest8.find_first_of("mx", 4) << std::endl;
std::cout << strTest8.find_first_of("xe", 8, 10) << std::endl;
std::cout << strTest8.find_first_of('m') << std::endl;
std::cout << strTest8.find_first_of('e', 8) << std::endl;
std::cout << strTest8.find_last_of("mx") << std::endl;
std::cout << strTest8.find_last_of("mx", 4) << std::endl;
std::cout << strTest8.find_last_of("xe", 8, 10) << std::endl;
std::cout << strTest8.find_last_of('m') << std::endl;
std::cout << strTest8.find_last_of('e', 8) << std::endl;
std::cout << strTest8.find_first_not_of("this") << std::endl;
std::cout << strTest8.find_first_not_of("this", 4) << std::endl;
std::cout << strTest8.find_first_not_of("th", 8, 10) << std::endl;
std::cout << strTest8.find_first_not_of('t') << std::endl;
std::cout << strTest8.find_first_not_of('t', 8) << std::endl;
std::cout << strTest8.find_last_not_of("!elp") << std::endl;
std::cout << strTest8.find_last_not_of("!elp", 4) << std::endl;
std::cout << strTest8.find_last_not_of("xe", 8, 10) << std::endl;
std::cout << strTest8.find_last_not_of('m') << std::endl;
std::cout << strTest8.find_last_not_of('e', 8) << std::endl;
数值转字符串
函数 |
返回值 |
功能 |
to_string() |
字符串对象 |
数值转字符串 |
std::cout << std::to_string(65535) << std::endl;
std::cout << std::to_string(3.1415926) << std::endl;
字符串转数值
函数 |
返回值 |
功能 |
stoi() |
有符合int值 |
字符串转有符合int |
stol() |
有符合long值 |
字符串转有符合long |
stoll() |
有符号long long值 |
字符串转有符合long long |
stoul() |
无符号long值 |
字符串转无符号long |
stoull() |
无符号long long值 |
字符串转无符号long long |
stof() |
float值 |
字符串转float |
stod() |
double值 |
字符串转double |
stold() |
long double值 |
字符串转long double |
std::cout << std::stoi(std::string("65535")) << std::endl;
std::cout << std::stol(std::string("12345678")) << std::endl;
std::cout << std::stoll(std::string("123456789987654321")) << std::endl;
std::cout << std::stof(std::string("3.1415")) << std::endl;
std::cout << std::stod(std::string("2.5e12")) << std::endl;
STL库还提供了string_view类,可以使用string_view类来代替string类,从而提高字符串各种操作的性能。