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的初始化、赋值、添加、删除、访问)相关推荐

  1. C++知识点30——使用C++标准库(关联容器map及其初始化,赋值,查找,添加,删除与迭代器失效)

    一.关联容器简介 关于顺序容器和关联容器的区别已经在博客https://blog.csdn.net/Master_Cui/article/details/107427911中提过 C++标准库中的关联 ...

  2. C++知识点31——使用C++标准库(关联容器multimap及其初始化,赋值,查找,添加,删除与迭代器失效)

    关于关联容器map已经在博客https://blog.csdn.net/Master_Cui/article/details/108690877中介绍完了 multimap和map非常类似,容器中的元 ...

  3. C++知识点24——使用C++标准库(顺序容器deque的初始化,赋值,访问,添加,删除,交换与迭代器失效)

    deque容器是双端队列,使用前,需要添加#include <deque> deque的内存结构如下: 根据上图可知,deque和vector,string稍有不同,deque的内存是分段 ...

  4. C++知识点22——使用C++标准库(顺序容器list的初始化、赋值、访问、交换、添加、删除与迭代器失效)

    list容器是双向链表,使用前,需要添加#include <list> 1.list的初始化 常用的构造函数如下 explicit list (const allocator_type&a ...

  5. C++知识点21——使用C++标准库(再谈string——string的搜索和数值转化)

    string的搜索操作一共6个 1.find size_t find (const string& str, size_t pos = 0) const; //从调用对象的下标pos处开始查找 ...

  6. C++知识点28——使用C++标准库(再谈迭代器)

    一.迭代器的种类 C++中的容器以及泛型算法会大量的使用迭代器 目前已经出现的迭代器有一下几种 1.输出迭代器 (OutputIterator) 输出迭代器类似于输出流(只能向输出流中写入数据),只能 ...

  7. C++知识点32——使用C++标准库(关联容器set和multiset的初始化,赋值,查找,添加,删除与迭代器失效)

    关联容器map和multimap已经在博客https://blog.csdn.net/Master_Cui/article/details/108690877和https://blog.csdn.ne ...

  8. C++知识点26——使用C++标准库(常用的泛型算法1)

    C++中实现了很多的泛型算法,大约100多个,使用前要添加#include<algorithm> 下面介绍的基本可以满足绝大部分需求,其他的用到再查 一.计数算法 1.count temp ...

  9. C++知识点23——使用C++标准库(顺序容器list的其他操作)

    除了博客https://blog.csdn.net/Master_Cui/article/details/107751785中介绍的操作,list还有一些其他的操作 1.reverse void re ...

最新文章

  1. UIView常用的一些方法小记之setNeedsDisplay和setNeedsLayout
  2. Swift - 多行文本输入框(UITextView)的用法
  3. python基础包括什么-Python基础教程 模块包含什么
  4. jquery-validation插件
  5. 聊聊JVM(三)两种计算Java对象大小的方法
  6. HDLBits答案(18)_Verilog有限状态机(5)
  7. 网络协议:TCP拥塞控制
  8. java 不指定大小接收
  9. Altium AD20将已有的原理图PCB导出为封装库
  10. Quick, Draw! Kaggle挑战赛丨现在,轮到你来猜了
  11. executorservice 重启_iPhone7使用久了突然手机自动重启,多半原因出在这儿,进来看看...
  12. CLient-Initiated L2TP主机上网问题详解
  13. xgboost三种特征重要性选择方法
  14. 190517每日一句
  15. 快速了解Redis、Cachecloud集群的搭建及管理
  16. java覆盖写入_java写入文件(覆盖和续写)
  17. echarts 3D地球
  18. 合并多个 .ts 文件为单个 .mp4 解决方案
  19. Nlog日志记录组件使用
  20. 51nod 1113 矩阵快速幂 模板

热门文章

  1. 安卓 AsyncHttpClient - “Content-Type not allowed!”
  2. 我的实用设计模式 - Simple Factory和Reflection
  3. CMake 条件判断
  4. c#获取电脑硬件信息参数说明(主板篇 Win32_BaseBoard )
  5. 【Ethereum】以太坊ERC20 Token标准完整说明
  6. 微信小程序:字体保持大小
  7. 第四十四节,subprocess系统命令模块
  8. 毕业设计:基于SSM实现新生报道系统
  9. Java项目:基于SSM实现房屋租赁系统
  10. jmeter测试webservice接口