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);
前四个构造函数的使用见博客
第五个构造函数
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》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
本文详细介绍了C++标准库中的string类,包括其构造函数、赋值、增加、删除、替换操作以及元素访问方法。通过具体示例展示了string类的各种功能,如从特定位置拷贝字符串、插入和替换字符串片段等。
2263

被折叠的 条评论
为什么被折叠?



