C++知识点19——使用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,所以输出45678cout<<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个ctemplate <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个ctemplate <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); //将范围迭代器内的字符串替换为strstring& 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++知识点19——使用C++标准库(再谈string——string的初始化、赋值、添加、删除、访问)相关推荐
- C++知识点30——使用C++标准库(关联容器map及其初始化,赋值,查找,添加,删除与迭代器失效)
一.关联容器简介 关于顺序容器和关联容器的区别已经在博客https://blog.csdn.net/Master_Cui/article/details/107427911中提过 C++标准库中的关联 ...
- C++知识点31——使用C++标准库(关联容器multimap及其初始化,赋值,查找,添加,删除与迭代器失效)
关于关联容器map已经在博客https://blog.csdn.net/Master_Cui/article/details/108690877中介绍完了 multimap和map非常类似,容器中的元 ...
- C++知识点24——使用C++标准库(顺序容器deque的初始化,赋值,访问,添加,删除,交换与迭代器失效)
deque容器是双端队列,使用前,需要添加#include <deque> deque的内存结构如下: 根据上图可知,deque和vector,string稍有不同,deque的内存是分段 ...
- C++知识点22——使用C++标准库(顺序容器list的初始化、赋值、访问、交换、添加、删除与迭代器失效)
list容器是双向链表,使用前,需要添加#include <list> 1.list的初始化 常用的构造函数如下 explicit list (const allocator_type&a ...
- C++知识点21——使用C++标准库(再谈string——string的搜索和数值转化)
string的搜索操作一共6个 1.find size_t find (const string& str, size_t pos = 0) const; //从调用对象的下标pos处开始查找 ...
- C++知识点28——使用C++标准库(再谈迭代器)
一.迭代器的种类 C++中的容器以及泛型算法会大量的使用迭代器 目前已经出现的迭代器有一下几种 1.输出迭代器 (OutputIterator) 输出迭代器类似于输出流(只能向输出流中写入数据),只能 ...
- C++知识点32——使用C++标准库(关联容器set和multiset的初始化,赋值,查找,添加,删除与迭代器失效)
关联容器map和multimap已经在博客https://blog.csdn.net/Master_Cui/article/details/108690877和https://blog.csdn.ne ...
- C++知识点26——使用C++标准库(常用的泛型算法1)
C++中实现了很多的泛型算法,大约100多个,使用前要添加#include<algorithm> 下面介绍的基本可以满足绝大部分需求,其他的用到再查 一.计数算法 1.count temp ...
- C++知识点23——使用C++标准库(顺序容器list的其他操作)
除了博客https://blog.csdn.net/Master_Cui/article/details/107751785中介绍的操作,list还有一些其他的操作 1.reverse void re ...
最新文章
- UIView常用的一些方法小记之setNeedsDisplay和setNeedsLayout
- Swift - 多行文本输入框(UITextView)的用法
- python基础包括什么-Python基础教程 模块包含什么
- jquery-validation插件
- 聊聊JVM(三)两种计算Java对象大小的方法
- HDLBits答案(18)_Verilog有限状态机(5)
- 网络协议:TCP拥塞控制
- java 不指定大小接收
- Altium AD20将已有的原理图PCB导出为封装库
- Quick, Draw! Kaggle挑战赛丨现在,轮到你来猜了
- executorservice 重启_iPhone7使用久了突然手机自动重启,多半原因出在这儿,进来看看...
- CLient-Initiated L2TP主机上网问题详解
- xgboost三种特征重要性选择方法
- 190517每日一句
- 快速了解Redis、Cachecloud集群的搭建及管理
- java覆盖写入_java写入文件(覆盖和续写)
- echarts 3D地球
- 合并多个 .ts 文件为单个 .mp4 解决方案
- Nlog日志记录组件使用
- 51nod 1113 矩阵快速幂 模板
热门文章
- 安卓 AsyncHttpClient - “Content-Type not allowed!”
- 我的实用设计模式 - Simple Factory和Reflection
- CMake 条件判断
- c#获取电脑硬件信息参数说明(主板篇 Win32_BaseBoard )
- 【Ethereum】以太坊ERC20 Token标准完整说明
- 微信小程序:字体保持大小
- 第四十四节,subprocess系统命令模块
- 毕业设计:基于SSM实现新生报道系统
- Java项目:基于SSM实现房屋租赁系统
- jmeter测试webservice接口