C++/C++11中std::string是个模板类,它是一个标准库。使用string类型必须首先包含头文件。作为标准库的一部分,string定义在命名空间std中。
构造函数初始化
#include <iostream>
#include <string>
int main ()
{
std::string s0 ("Hello World"); //根据已有字符串构造新的string实例
std::string s1; //默认初始化,s1是个空字符串;
std::string s2(s0); //通过复制一个string构造一个新的string
std::string s3(s0, 8, 3);//通过复制一个string的一部分来构造一个新的string。8为起始位置,3为偏移量。
std::string s4 ("A character sequence"); //与s0构造方式相同。
std::string s5 ("Another character sequence", 12); //已知字符串,通过截取指定长度来创建一个string
std::string s6a (10, 'x'); //指定string长度,与一个元素,则默认重复该元素创建string
std::string s6b (10, 42); // 42 is the ASCII code for '*' //通过ASCII码来代替s6a中的指定元素。
std::string s7 (s0.begin(), s0.begin()+7); //通过迭代器来指定复制s0的一部分,来创建s7
std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;
std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;
std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';
return 0;
}
//Output:
//s1:
//s2: Initial string
//s3: str
//s4: A character sequence
//s5: Another char
//s6a: xxxxxxxxxx
//s6b: **********
//s7: Initial
std::string s1( p ,n); //s1是p指向的数组中前n个字符串的copy。p是字符指针。此数组中至少有n个字符
std::string s2(s1,pos2); //从s1下标为pos2的位置copy。pos2应大于 s1.size(),即大于s1的长度
std::string s3(s1,pos3,length); //从s1下标为pos3的位置copy长度为length的字符串。同样pos3应大于s1的长度不管。length值为多少,都只拷贝到s1结束
注意,此处的n,pos2,pos3,length都是无符号整型。
string::operation =
使用 = 运算符也可以创建string。可参考如下代码:
#include <iostream>
#include <string>
int main ()
{
const char *p = “hello_world!!”; //以空字符结尾的数组
char str[] = {'h','e','l','l','o'}; //不是以空字符结尾的数组,sizeof(str) = 5
std::string s0 = "Hello World";//等价于std::string s0 ("Hello World");
std::string s1 = s0; //等价于std::string s1(s0);
std::string s2(p); //s2 = “hello_world!!”
std::string s3(str); //错误,str是个字符数组,不是字符串,不以空字符结尾,故会报错
std::string s4(str,2); //s4 = “he”
std::string s5(p+6,5); //s5 = “world”
std::string s6(s0,6); //s6 = “world!!”
std::string s6(s0,6,5); //s6 = “world”
std::string s7(s0,6,30); //s7 = “world!!”
return 0;
}
char str[] = {'h','e','l','l','o'}; //不是以空字符结尾的数组,sizeof(str) = 5
char str1[] = "hello"; //以空字符串结尾的数组,sizeof(str1) = 6
注意事项:
1.通过C字符数组给string赋值时,确保有’\0’空字符结尾;
成员函数
构造函数 构造 basic_string
析构函数 销毁字符串,若使用内部存储则解分配它
operator= 为字符串赋值
assign 赋值字符给字符串
get_allocator 返回关联的分配器
元素访问
at 访问指定字符,有边界检查
operator[] 访问指定字符
front(C++11) 访问首字符
back(C++11) 访问最后的字符
data 返回指向字符串首字符的指针
c_str 返回字符串的不可修改的 C 字符数组版本
迭代器
begin
cbegin(C++11) 返回指向起始的迭代器
end
cend(C++11) 返回指向末尾的迭代器
rbegin
crbegin(C++11) 返回指向起始的逆向迭代器
rend
crend(C++11) 返回指向末尾的逆向迭代器
容量
empty 检查字符串是否为空
size
length 返回字符数
max_size 返回字符数的最大值
reserve 保留存储
capacity 返回当前对象分配的存储空间能保存的字符数量
shrink_to_fit(C++11) 通过释放不使用内存减少内存使用
操作
clear 清除内容
insert 插入字符
erase 移除字符
push_back 后附字符到结尾
pop_back(C++11) 移除末尾字符
append 后附字符到结尾
operator+= 后附字符到结尾
compare 比较二个字符串
starts_with(C++20) 检查 string 是否始于给定前缀
ends_with(C++20) 检查 string 是否终于给定后缀
replace 替换字符串的指定部分
substr 返回子串
copy 复制字符
resize 更改存储的字符数
swap 交换内容
查找
find 于字符串中寻找字符
rfind 寻找子串的最后一次出现
find_first_of 寻找字符的首次出现
find_first_not_of 寻找字符的首次缺失
find_last_of 寻找字符的最后一次出现
find_last_not_of 寻找字符的最后一次缺失
常量
npos[静态] 特殊值。准确含义依赖语境
示例一:字符串替换
#include <iostream>
#include <string>
using namespace std;
/*****************************************************************************
* 函 数 名 : replace_all
* 函数功能 : string循环替换所有指定字符串
* 输入参数 : string& str 要操作字符串
* 输入参数 : const string& old_value 要替换的字符串
* 输入参数 : const string& new_value 新的字符串
* 输出参数 : string& str 要操作字符串
* 返 回 值 : string& str
* 例 子 : 将”12212″这个字符串的所有”12″都替换成”21″,结果22211
*****************************************************************************/
string& replace_all(string &str,const string& old_value,const string& new_value)
{
if(old_value == new_value) return str;
while(true)
{
string::size_type pos(0);
if( (pos=str.find(old_value))!=string::npos )
str.replace(pos,old_value.length(),new_value);
else break;
}
return str;
}
/*****************************************************************************
* 函 数 名 : replace_all_distinct
* 函数功能 : string一次性替换所有指定字符串
* 输入参数 : string& str 要操作字符串
* 输入参数 : const string& old_value 要替换的字符串
* 输入参数 : const string& new_value 新的字符串
* 输出参数 : string& str 要操作字符串
* 返 回 值 : string& str
* 例 子 : 将”12212″这个字符串的所有”12″都替换成”21″,结果21221
*****************************************************************************/
string& replace_all_distinct(string& str,const string& old_value,const string& new_value)
{
if(old_value == new_value) return str;
for(string::size_type pos(0); pos!=string::npos; pos+=new_value.length()){
if( (pos=str.find(old_value,pos))!=string::npos )
str.replace(pos,old_value.length(),new_value);
else break;
}
return str;
}
int main ()
{
string str1,str2,str3,str4;
str1 = "12212";
str2 = "12212";
str3 = replace_all(str1,"12","21");
str4 = replace_all_distinct(str2,"12","21");
cout << "str3: " << str3 << "\nstr4: " << str4;
return 0;
}
//输出
//str3: 22211
//str4: 21221
参考资料:
https://zh.cppreference.com/w/cpp/string/basic_string
https://www.cnblogs.com/skyfsm/p/6934246.html
https://jingyan.baidu.com/article/20b68a8854f919796dec6265.html
https://www.cnblogs.com/catgatp/p/6407783.html
https://blog.csdn.net/autocyz/article/details/42391155
https://www.cnblogs.com/skyfsm/p/6934246.html#top
https://blog.csdn.net/lanyzh0909/article/details/6957649