常用函数
函数名 | 说明 |
---|---|
at 、[] | 获取单个字符 |
append | 追加字符串 |
insert | 插入字符串 |
length、size | 字符长度 |
empty | 返回布尔值,判断是否字符串为空 |
capacity | 字符串容量 |
reserve | 预分配内存,至少保证能容纳n个字符而不必重新分配 |
find | 字符串查找 |
replace | 字符串替换 |
resize | 改变字符串大小,可选填充值初始化新空间。 |
substr | 获取子字符串 |
std::string::npos
std::string::npos
是C++标准库中std::string
类的一个静态成员常量,其值通常被定义为std::size_t
类型的最大值。这个特殊值常用于表示没有找到所查找的子串,或者表示一个超出字符串长度的有效索引位置。
示例:
std::string str = "Hello, world!";
size_t found = str.find("world");
if (found != std::string::npos) {std::cout << "找到子串 'world' 在位置: " << found << std::endl;
} else {std::cout << "没有找到子串 'world'" << std::endl;
}
示例1:
string str="abc";
// 设置字符串的预留容量为100个字符
str.reserve(100);//如果预先知道str会增长到一定程序,可以先预留容量
//避免内存多次分配,提高效率,当str长度超过100时,会自动扩容
std::cout<<str.capacity()<<std::endl;
示例2:
string str="abc";
//字符串长度
std::cout<<str.length()<<std::endl;
//下标超过不会报错
std::cout<<"取单个字符:"<<str[10]<<endl;
//超过会报错
std::cout<<"取单个字符:"<<str.at(1)<<endl;
//遍历
int abc=str.length();
for(int i =0;i < abc;i++){std::cout<<str[i]<<std::endl;
}
//第二种
for(char &i :str){std::cout<<i<<std::endl;
}
字符串替换
#include <iostream>
#include <string>
using namespace std;//字符串替换,利用 string 的replace 方法和 find 方法,重新实现了一个函数,方便字符串的替换
std::string replace(std::string str, const std::string& from, const std::string& to, size_t maxReplacements = std::string::npos) {size_t startPos = 0;size_t replacementsDone = 0;// 主循环:只要能找到"from"子串并且没有超过最大替换次数while ((startPos = str.find(from, startPos)) != std::string::npos) {if (maxReplacements != std::string::npos && replacementsDone >= maxReplacements) {break; // 达到最大替换次数,退出循环}str.replace(startPos, from.length(), to);// 移动到替换后的位置,避免在新插入的子串中再次查找startPos += to.length();++replacementsDone;}return str;
}
int main()
{std::string str = "aaa bbb ccc";std::cout<<replace(str,"b","x",1)<<std::endl;std::cout<<replace(str,"b","x")<<std::endl;std::cout<<replace(str,"b","xx")<<std::endl;return 0;
}
分割字符串
#include <iostream>
#include <string>
#include <vector>
using namespace std;std::vector<std::string> split(const std::string& s, std::string delimiter) {std::vector<std::string> tokens;size_t start = 0;size_t end = s.find(delimiter);while (end != std::string::npos) {tokens.push_back(s.substr(start, end - start));start = end + delimiter.length();end = s.find(delimiter, start);}tokens.push_back(s.substr(start, end)); // 添加最后一个子串return tokens;
}int main()
{std::string str = "aaa;bbb;ccc";auto res= split(str,";");for (const auto& val : res) {std::cout << val << std::endl;}return 0;
}
类型转换
- std::stoi 字符串转整数, 可以 翻译成 string to int
- std::stof 字符串转float, 可以 翻译成 string to float
- std::stod 字符串转double, 可以 翻译成 string to double
- std::to_string 将其他数据类型转成string
- 转换的时候,需要捕获异常,因为容易转换失败
string转int
#include <string>
#include <iostream>
using namespace std;int main()
{string strNum = "123.12";try {int num = std::stoi(strNum);std::cout << "转换后的整数为:" << num << std::endl;} catch (const std::invalid_argument& e) {std::cerr << "无法转换为整数: " << e.what() << std::endl;} catch (const std::out_of_range& e) {std::cerr << "超出整数范围: " << e.what() << std::endl;}return 0;
}
int、float、double转string
#include <string>
using namespace std;
int main()
{ int num = 123;float f=12.3;double a=123.222;std::string strNum1 = std::to_string(num);std::string strNum2 = std::to_string(f);std::string strNum3 = std::to_string(a);return 0;
}