前言

之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联。我们尽可以把它看成是C++的基本数据类型。

构造函数

  • 功能
    产生或复制字符串
  • 构造
string(const char *s);    //用字符串s初始化
string(int n,char c);     //用n个字符c初始化
  • 声明
    声明一个字符串变量很简单:
string Str;

这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:

a)      string s;    //生成一个空字符串s
b)      string s(str) //拷贝构造函数 生成str的复制品
c)      string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值
d)      string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值
e)      string s(cstr) //将C字符串作为s的初值
f)      string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
g)      string s(num,c) //生成一个字符串,包含num个c字符
h)      string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值

析构函数

  • 功能
    销毁字符串
  • 方式
s.~string() //销毁所有字符,释放内存

字符串操作函数

这里是C++字符串的重点,这里我们先罗列,后面在分别做详细解释,这样的话可能会显得稍微清晰一点。

  • =,assign() //赋以新值
  • swap() //交换两个字符串的内容
  • +=,append(),push_back() //在尾部添加字符
  • insert() //插入字符
  • erase() //删除字符
  • clear() //删除全部字符
  • replace() //替换字符
  • + //串联字符串
  • ==,!=,<,<=,>,>=,compare() //比较字符串
  • size(),length() //返回字符数量
  • max_size() //返回字符的可能最大个数
  • empty() //判断字符串是否为空
  • capacity() //返回重新分配之前的字符容量
  • reserve() //保留一定量内存以容纳一定数量的字符
  • [ ], at() //存取单一字符
  • >,getline() //从stream读取某值
  • << //将谋值写入stream
  • copy() //将某值赋值为一个C_string
  • c_str() //将内容以C_string返回
  • data() //将内容以字符数组形式返回
  • substr() //返回某个子字符串
  • find() //查找函数
  • begin() end() //提供类似STL的迭代器支持
  • rbegin() rend() //逆向迭代器
  • get_allocator() //返回配置器

=,assign()

  • 功能
    C++ string类的成员函数,用于拷贝、赋值操作,它们允许我们顺序地把一个string 对象的部分内容拷贝到另一个string 对象上。
  • 说明
string &operator=(const string &s);//把字符串s赋给当前字符串
string &assign(const char *s);//用c类型字符串s赋值
string &assign(const char *s,int n);//用c字符串s开始的n个字符赋值
string &assign(const string &s);//把字符串s赋给当前字符串
string &assign(int n,char c);//用n个字符c赋值给当前字符串
string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串
string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部分赋给字符串
  • 使用方式

    • 直接用另一个字符串赋值,如:
    str2.assign(str1);//即用str1给str2赋值.
    
    • 用另一个字符串的一个子串赋值,如:
    str3.assign(str1, 2, 3);
    
    • 用一个字符串的前一段子串赋值,如:
    str4.assign(“World”, 5);
    
    • 用几个相同的字符,赋值,如:
    str5.assign(10, ‘c’);
    
    /*************************************************
    // Copyright (C), 2020-221, Sunking&Yang. Co., Ltd.
    // 文件名: xxx.cpp
    // 作者: SunkingYang
    // 版本: 1.0
    // 日期: 2020/04/09
    //博客地址:https://blog.csdn.net/y601500359
    // 说明:原创不易,转载请注明来源!
    *************************************************/
    #include<iostream>
    #include <string>
    using namespace std;
    //========================================
    int main()
    {std::string str1("hello");string str2;string str3;string str4;string str5;//====================================str2.assign(str1);str3.assign("World", 4);str4.assign(str1, 2, 3);str5.assign(10, 'c');//====================================cout << str1 << endl;cout << str2 << endl;cout << str3 << endl;cout << str4 << endl;cout << str5 << endl;//====================================system("pause");return 0;
    }
    

    运行效果图:

Swap

void swap(string &s2);    //交换当前字符串与s2的值

+=,append( ),push_back()

  • 功能:
    在尾部添加字符
  • 说明:
string &operator+=(const string &s);//把字符串s连接到当前字符串的结尾
string &append(const char *s);            //把c类型字符串s连接到当前字符串结尾
string &append(const char *s,int n);//把c类型字符串s的前n个字符连接到当前字符串结尾
string &append(const string &s);    //同operator+=()
string &append(const string &s,int pos,int n);//把字符串s中从pos开始的n个字符连接到当前字符串的结尾
string &append(int n,char c);        //在当前字符串结尾添加n个字符c
string &append(const_iterator first,const_iterator last);//把迭代器first和last之间的部分连接到当前字符串的结尾
  • 使用例子:
s+=str;//加个字符串
s+=”my name is jiayp”;//加个C字符串
s+=’a’;//加个字符
s.append(str);
s.append(str,1,3);
s.append(str,2,string::npos)
s.append(“my name is jiayp”);
s.append(“nico”,5);
s.append(5,’x’);
s.push_back(‘a’);//这个函数只能增加单个字符对STL熟悉的理解起来很简单

insert()

  • 功能
    插入字符
  • 说明
string &insert(int p0, const char *s);
string &insert(int p0, const char *s, int n);
string &insert(int p0,const string &s);
string &insert(int p0,const string &s, int pos, int n);
//前4个函数在p0位置插入字符串s中pos开始的前n个字符
string &insert(int p0, int n, char c);//此函数在p0处插入n个字符c
iterator insert(iterator it, char c);//在it处插入字符c,返回插入后迭代器的位置
void insert(iterator it, const_iterator first, const_iterator last);//在it处插入[first,last)之间的字符
void insert(iterator it, int n, char c);//在it处插入n个字符c

erase()

  • 功能:删除字符
iterator erase(iterator first, iterator last);//删除[first,last)之间的所有字符,返回删除后迭代器的位置
iterator erase(iterator it);//删除it指向的字符,返回删除后迭代器的位置
string &erase(int pos = 0, int n = npos);//删除pos开始的n个字符,返回修改后的字符串

clear()

  • 功能:删除全部字符
string str;
str="balabala";
s.clear();

replace()

  • 功能:替换字符
string &replace(int p0, int n0,const char *s);//删除从p0开始的n0个字符,然后在p0处插入串s
string &replace(int p0, int n0,const char *s, int n);//删除p0开始的n0个字符,然后在p0处插入字符串s的前n个字符
string &replace(int p0, int n0,const string &s);//删除从p0开始的n0个字符,然后在p0处插入串s
string &replace(int p0, int n0,const string &s, int pos, int n);//删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符
string &replace(int p0, int n0,int n, char c);//删除p0开始的n0个字符,然后在p0处插入n个字符c
string &replace(iterator first0, iterator last0,const char *s);//把[first0,last0)之间的部分替换为字符串s
string &replace(iterator first0, iterator last0,const char *s, int n);//把[first0,last0)之间的部分替换为s的前n个字符
string &replace(iterator first0, iterator last0,const string &s);//把[first0,last0)之间的部分替换为串s
string &replace(iterator first0, iterator last0,int n, char c);//把[first0,last0)之间的部分替换为n个字符c
string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last);//把[first0,last0)之间的部分替换成[first,last)之间的字符串

+

  • 功能:串联字符串
string str1 = "abc";
string str2 = "def";
string str3 = str1 + str2;

==,!=,<,<=,>,>=,compare()

  • 功能:比较字符串
int compare(const string &s) const;//比较当前字符串和s的大小
int compare(int pos, int n,const string &s)const;//比较当前字符串从pos开始的n个字符组成的字符串与s的大小
int compare(int pos, int n,const string &s,int pos2,int n2)const;//比较当前字符串从pos开始n个字符字符串与s中pos2开始n2个字符字符串的大小
int compare(const char *s) const;
int compare(int pos, int n,const char *s) const;
int compare(int pos, int n,const char *s, int pos2) const;

compare函数在>时返回1,<时返回-1,==时返回0

string的特性描述

  • size(),length()
    功能:返回字符数量
  • max_size()
    功能:返回字符的可能最大个数
  • empty()
    功能:判断字符串是否为空
  • capacity()
    功能:返回重新分配之前的字符容量
int capacity()const;    //返回当前容量(即string中不必增加内存即可存放的元素个数)
int max_size()const;    //返回string对象中可存放的最大字符串的长度
int size()const;        //返回当前字符串的大小
int length()const;       //返回当前字符串的长度
bool empty()const;        //当前字符串是否为空
void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分

reserve()

  • 功能:保留一定量内存以容纳一定数量的字符

[ ], at()

  • 功能:存取单一字符
const char &operator[](int n)const;
const char &at(int n)const;
char &operator[](int n);
char &at(int n);

operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。

输入输出操作

  • >>,getline()
    功能:从stream读取某值
  • <<
    功能:将谋值写入stream
    string类重载运算符operator>>用于输入,同样重载运算符operator<<用于输出操作
getline(istream &in,string &s); //用于从输入流in中读取字符串到s中,以换行符'\n'分开
//eg:
string s1;
getline (cin, s1); // 实现了读取一行字符,包括空格、制表符、回车符等行内字符和符号,以\n分开
  • copy()
    功能:将某值赋值为一个C_string
  • c_str()
    功能:将内容以C_string返回
  • data()
    功能:将内容以字符数组形式返回
const char *data()const;//返回一个非null终止的c字符数组
const char *c_str()const;//返回一个以null终止的c字符串
int copy(char *s, int n, int pos = 0) const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目

substr()

  • 功能:返回某个子字符串
string substr(int pos = 0,int n = npos) const;//返回pos开始的n个字符组成的字符串

find()

  • 功能:查找函数
int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置
int find(const char *s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置
int find(const char *s, int pos, int n) const;//从pos开始查找字符串s中前n个字符在当前串中的位置
int find(const string &s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置
//查找成功时返回所在位置,失败返回string::npos的值int rfind(char c, int pos = npos) const;//从pos开始从后向前查找字符c在当前串中的位置
int rfind(const char *s, int pos = npos) const;
int rfind(const char *s, int pos, int n = npos) const;
int rfind(const string &s,int pos = npos) const;
//从pos开始从后向前查找字符串s中前n个字符组成的字符串在当前串中的位置,成功返回所在位置,失败时返回string::npos的值int find_first_of(char c, int pos = 0) const;//从pos开始查找字符c第一次出现的位置
int find_first_of(const char *s, int pos = 0) const;
int find_first_of(const char *s, int pos, int n) const;
int find_first_of(const string &s,int pos = 0) const;
//从pos开始查找当前串中第一个在s的前n个字符组成的数组里的字符的位置。查找失败返回string::nposint find_first_not_of(char c, int pos = 0) const;
int find_first_not_of(const char *s, int pos = 0) const;
int find_first_not_of(const char *s, int pos,int n) const;
int find_first_not_of(const string &s,int pos = 0) const;
//从当前串中查找第一个不在串s中的字符出现的位置,失败返回string::nposint find_last_of(char c, int pos = npos) const;
int find_last_of(const char *s, int pos = npos) const;
int find_last_of(const char *s, int pos, int n = npos) const;
int find_last_of(const string &s,int pos = npos) const;
int find_last_not_of(char c, int pos = npos) const;
int find_last_not_of(const char *s, int pos = npos) const;
int find_last_not_of(const char *s, int pos,  int n) const;
int find_last_not_of(const string &s,int pos = npos) const;
//find_last_of和find_last_not_of与find_first_of和find_first_not_of相似,只不过是从后向前查找

迭代器处理 const_iterator

  • begin() end()
    功能:提供类似STL的迭代器支持
  • rbegin() rend()
    功能:逆向迭代器
const_iterator begin()const;
iterator begin();                //返回string的起始位置
const_iterator end()const;
iterator end();                    //返回string的最后一个字符后面的位置
const_iterator rbegin()const;
iterator rbegin();                //返回string的最后一个字符的位置
const_iterator rend()const;
iterator rend();                    //返回string第一个字符位置的前面

rbegin和rend用于从后向前的迭代访问,通过设置迭代器string::reverse_iterator,string::const_reverse_iterator实现

get_allocator()

  • 功能:返回配置器

参考链接1:http://c.biancheng.net/view/1441.html
参考链接2:https://blog.csdn.net/sinat_36184075/article/details/54836053
参考链接3:https://www.cnblogs.com/Draymonder/p/6944479.html

STL之字符串类模板 string(三)、C++ string类成员函数相关推荐

  1. c++模板---3(类模板碰到继承问题,类模板类外实现,类模板与友元函数)

    类模板碰到继承问题 基类如果是模板类,必须让子类告诉编译器 基类中的T到底是什么类型 如果不告诉,那么无法分配内存,编译不过 利用参数列表class Child :public Base<int ...

  2. 创建一个Date类,具有三个整型成员变量year,month,day,具有三个成员方法setDate,isLeapYear,print

    创建一个Date类,具有三个整型成员变量year,month,day,具有三个成员方法setDate,isLeapYear,print,其中setDate用来给成员变量赋值, isLeapYear用来 ...

  3. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

  4. 类模板里面的函数写在类模板里面和写在类模板的外面,且在1个.cpp文件中

    和类一样,类模板里面声明的函数,其函数体写在类里面和外面都行,但是有一点需要注意:1.用友元函数重载<< 或 >>运算符,函数声明写在类模板里面,函数实现写在类模板外面,要在函 ...

  5. C++类模板的三种特化类型

    From: http://blog.sina.com.cn/s/blog_65d069c601010fb3.html 说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相 ...

  6. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  7. C++模板笔记十:类模板案例:通用数组类

    案例描述: 实现一个通用的数组类,要求如下: 可以对内置数据类型以及自定义数据类型的数据进行存储. 将数组中的数据存储到堆区 构造函数中可以传入数组的容量 提供对应的拷贝构造函数以及operator= ...

  8. 一文带你入门C++,类与对象、6个默认成员函数、this指针以及static关键字。

    C++98关键字:63个 一.命名空间规则(namespace) 1.命名空间可以解决函数.全局变量名重复的问题,包在不同的命名空间里的重复函数,实际就是两个完全无关的函数. 2.命名空间允许续嵌套: ...

  9. 《C++类基本知识和6个默认成员函数详细剖析》

    面向对象编程–类的认识 之前我们学习了C语言知识,C语言是一种面向过程的程序设计语言,而C++语言呢是基于面向对象的一种程序设计语言,关注的是对象,即将一件事情拆分成不同的对象,靠对象间的交互完成.接 ...

  10. C++类与对象(二) 六个默认成员函数

    目录 1.构造函数 (1)引入 (2)性质与验证 (3)总结 2.析构函数 (1)概念 (2)性质与验证 (3)总结 3拷贝构造函数 (1)概念 (2)性质与验证 (3)总结 4.赋值运算符重载 (1 ...

最新文章

  1. 如何降低QPS(错峰、限流、削峰)
  2. 产品经理的知识结构是什么
  3. 罗小黑用flash做的_董小姐说电影丨这次都听我的,去看《罗小黑战记》
  4. Mysql的coalesce
  5. Jquery.load() 使用
  6. 一个静态库框架模板: iOS Universal Framework Mk 7
  7. kata_小规模流处理kata。 第2部分:RxJava 1.x / 2.x
  8. 这篇 Linux 总结得很棒啊!
  9. MySQL2种多实例部署方式总结
  10. Hibernate配置文件
  11. 一些用xib加载主界面的过程
  12. c语言求阶乘的两种算法(递归和循环)
  13. 图谱实战 | 谈元鹏:电力领域知识图谱技术进展与应用实践
  14. 七牛云和Github如何使用PicGo设置免费图床
  15. 敏捷测试 之 借力DSL
  16. NLP --- 词性标注
  17. 大数据常用同步工具(DataX/Sqoop/Nifi/Canal等)
  18. 2011年系统架构师考试题详解
  19. mysql事务是什么意思_mysql事务是什么意思
  20. 玩家八分类法则——四分类法则的进阶

热门文章

  1. 收到offer不想去,如何优雅拒绝?
  2. 脚踩智能汽车春风,百度踏上千亿美元市值征程
  3. CF# Educational Codeforces Round 3 F. Frogs and mosquitoes
  4. 看什么书可以提高情商?提高情商的书籍排行榜
  5. [转]多媒体范例: 如何使用CSS来格式化TLF文本
  6. MaprRduce v2 在 java 代码中远程提交作业到 Yarn 的配置项
  7. load.php 迅雷,C#_C#实现调用迅雷下载的方法,迅雷下载是目前使用非常普遍 - phpStudy...
  8. 130个资源网站,总有一个你用得着
  9. win10计算机磁盘图标,电脑win10系统磁盘分区ioc图标修改技巧
  10. LLS1000智能线路控制器