C++知识点19——使用C++标准库(再谈string——string的初始化、赋值、添加、删除、访问)

本文详细介绍了C++标准库中的string类,包括其构造函数、赋值、增加、删除、替换操作以及元素访问方法。通过具体示例展示了string类的各种功能,如从特定位置拷贝字符串、插入和替换字符串片段等。

1.string的构造函数

string();//默认构造函数,默认初始化时调用
string (const string& str);//拷贝构造函数,拷贝初始化时调用
string (size_t n, char c);//一般构造函数
string (const char* s);	//一般构造函数

string (const string& str, size_t pos, size_t len = npos);	
string (const char* s, size_t n);	

template <class InputIterator>
string  (InputIterator first, InputIterator last);

前四个构造函数的使用见博客

C++知识点4——vector与string简述

 

第五个构造函数

string (const string& str, size_t pos, size_t len = npos);

该构造函数表示从str下标为pos的位置开始,如果不指定len,则默认拷贝到字符串结束,如果指定len,那么拷贝从pos开始,长度为len的字符创

构造函数中最后一个参数是默认实参,其中npos是string类中的一个public static成员变量,如下定义

static const size_t npos = -1;

因为size_t表示无符号整形,用-1初始化之后,表示一个很大的数,而字符串几乎不会这么长,所以用这种方式来不仅表示字符串的结尾,还可以作为返回值表示没有匹配的字符串

 

示例

void stringlencopy()
{
	string s="1234576890";
	string s2(s, 1);//从下标1开始拷贝,一直拷贝到字符串结束
	cout<<s2<<endl;

	string s3(s, 3, 5);//从下标3的位置开始拷贝,拷贝的字符串长度为5,所以输出45678
	cout<<s3<<endl;
}

 

第六个构造函数

string (const char* s, size_t n);

该构造函数表示将字符数组中的s地址开始的n个字符拷贝到目标字符串中

 

示例

void stringleninit()
{
	const char *str="1234567";
	string s(str, 4);//拷贝前四个字符
	cout<<s<<endl;
      
      string s2(str+3, 3);//从地址str+3开始,拷贝3个字符
	cout<<s2<<endl;
}

 

第5,6个构造函数所指定的长度不能大于字符数组的长度,否则会产生异常数据或者程序挂掉

void stringinitfailed()
{
	string s="1234576890";
	string s2(s, 20);
	cout<<s2<<endl;
}

初始位置超过字符串总长度,out of range

 

void stringleninit()
{
	const char *str="1234567";
	string s(str, 20);
	cout<<s<<endl;
}

产生异常数据

 

最后一个构造函数接受一对迭代器,和vector类似

void stringiterinit()
{
	string s="1234576890";
	string s2(s.begin(), s.begin()+4);
	cout<<s2<<endl;
}

 

2.substr函数

该成员函数获取的是string对象从pos开始,长度为len的子串的拷贝

string substr (size_t pos = 0, size_t len = npos) const;

 

示例

void substrtest()
{
	string s="1234576890";
	string s2=s.substr(2);//从下标2开始,到字符串结尾的子串
	cout<<s2<<endl;

	string s3=s.substr(3,5);//从下标3开始,长度为5的子串
	cout<<s3<<endl;
}

 

同样,子串的起始位置的下标不能超过字符串的总长度

 

3.string的赋值

除了等号赋值,也可以用assign成员函数赋值,和vector类似,assign函数的形式有如下几种

string& assign (const string& str);
string& assign (const string& str, size_t subpos, size_t sublen);//子串赋值
string& assign (const char* s);//char数组赋值
string& assign (const char* s, size_t n);//指定长度的char数组赋值
string& assign (size_t n, char c);//赋值n个c

template <class InputIterator>
string& assign (InputIterator first, InputIterator last);//迭代器
string& assign (initializer_list<char> il);//列表

assgin的返回值是*this的引用

 

举例

void stringassign()
{
	string s="1234567890";
	string s2;
	s2.assign(s);
	cout<<s2<<endl;

	s2.assign(s, 2, 5);
	cout<<s2<<endl;

	const char *str="qwertyuiop";
	s2.assign(str+2);
	cout<<s2<<endl;

	s2.assign(str+3, 6);
	cout<<s2<<endl;

	s2.assign(10, *(str+4));
	cout<<s2<<endl;

	s2.assign(s.begin(), s.end()-4);
	cout<<s2<<endl;

	s2.assign({'1','2'});
	cout<<s2<<endl;
}

 

4.string的增加

除了push_back,还有insert方法,和vector类似

string& insert (size_t pos, const string& str);//从下标pos处插入
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);//从下标pos处插入子串
string& insert (size_t pos, const char* s);////从下标pos处插入字符数组
string& insert (size_t pos, const char* s, size_t n);////从下标pos处插入定长char数组
string& insert (size_t pos, size_t n, char c);////从下标pos处插入n个c
iterator insert (iterator p, size_t n, char c);//从迭代器p处插入n个c,返回第一个被插入的字符的迭代器
iterator insert (iterator p, char c);//插入一个c,返回第一个被插入的字符的迭代器

template <class InputIterator>
iterator insert (iterator p, InputIterator first, InputIterator last);
string& insert (const_iterator p, initializer_list<char> il);

前五个返回*this的引用,迭代器版本返回的是第一个被插入字符的迭代器

 

示例

void stringinsert()
{
	string t="1234567890";
	string s="1234567890";
	string s2="qwertyuiop";
	s.insert(s.size(), s2);
	cout<<s<<endl;
	s.assign(t);

	s.insert(4,s2,3,6);
	cout<<s<<endl;
	s.assign(t);

	const char *str="qwertyuiop";
	s.insert(4, str+4);
	cout<<s<<endl;
	s.assign(t);

	s.insert(4,str+4,3);
	cout<<s<<endl;
	s.assign(t);

	s.insert(4,10,*(str+6));
	cout<<s<<endl;
	s.assign(t);

	string::iterator it=
		s.insert(s.begin()+1, *(str+4));
	cout<<s<<' '<<*it<<' '<<*(--it)<<endl;
	s.assign(t);

	string::iterator it2=
		s.insert(s.begin()+1, 10, *(str+4));
	cout<<s<<' '<<*it2<<' '<<*(--it2)<<endl;
	s.assign(t);

	string::iterator it3=
		s.insert(s.begin()+1, s2.begin()+1, s2.end()-4);
	cout<<s<<' '<<*it3<<' '<<*(--it3)<<endl;
	s.assign(t);

	s.insert(s.begin(), {'n', 'm'});
	cout<<s<<endl;
}

string类还有一种特殊的末尾添加方法append,参数类型和insert雷同

string& append (const string& str);//在string末尾添加str
string& append (const string& str, size_t subpos, size_t sublen);//在string末尾添加部分str(从subpos开始,长度为sublen)
string& append (const char* s);//在尾部添加字符数组
string& append (const char* s, size_t n);//在尾部添加部分字符(从*s开始,长度为n)
string& append (size_t n, char c);//在尾部添加n个c

template <class InputIterator>
string& append (InputIterator first, InputIterator last);//范围迭代器
string& append (initializer_list<char> il);//列表

示例可参照insert进行仿写

 

5.删除string

除了pop_back外,也还有insert,和vector类似

string& erase (size_t pos = 0, size_t len = npos);//给定起始位置和长度,删除部分字符串,如果不指定,默认全部删除
iterator erase (const_iterator p);//删除迭代器指向的字符
iterator erase (const_iterator first, const_iterator last);//删除范围字符串

第一个返回*this的引用,剩余两个返回被删除元素之后的第一个元素的迭代器

 

示例

void erasestring()
{
	string s="1234567890";
	string::iterator it=s.erase(s.begin()+1);
	cout<<s<<*it<<endl;
}

其余的和vector的erase操作与string的上述操作类似

 

6.string的替换操作

string& replace (size_t pos,  size_t len,  const string& str);//将定长度的字符串替换为str
string& replace (const_iterator i1, const_iterator i2, const string& str);	//将范围迭代器内的字符串替换为str

string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);	//将定长的字符串替换为str中指定范围的字符串

string& replace (size_t pos, size_t len, const char* s);//将指定范围的字符串替换为字符数组
string& replace (const_iterator i1, const_iterator i2, const char* s);//将范围迭代器中的字符串替换为字符数组

string& replace (size_t pos, size_t len, const char* s, size_t n);//将指定范围的字符串替换为字符数组中的指定的某些字符
string& replace (const_iterator i1, const_iterator i2, const char* s, size_t n);
	
string& replace (size_t pos,size_t len, size_t n, char c);//将指定范围的字符串替换为n个字符
string& replace (const_iterator i1, const_iterator i2, size_t n, char c);
	
template <class InputIterator>//将范围迭代器中的字符串替换为另一组范围内的迭代器中的字符串
string& replace (const_iterator i1, const_iterator i2, InputIterator first, InputIterator last);

string& replace (const_iterator i1, const_iterator i2, initializer_list<char> il);//将范围迭代器中的字符串替换为列表

示例和insert assign的示例类似

 

7.访问string的元素

char& back();
const char& back() const;

char& at (size_t pos);
const char& at (size_t pos) const;

char& front();
const char& front() const;

同vector,见博客C++知识点17——使用C++标准库(顺序容器vector常用操作

 

参考

http://www.cplusplus.com/reference/string/string/string/

《C++ Primer》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值