std::string

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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值