http://blog.csdn.net/liuliming3000/article/details/1809385

1 从C到C++ string类

2 string类的构造函数

3 string类的字符操作

4 string的特性描述

5 string类的输入输出操作

6 string的赋值

7 string的连接

8 string的比较

9 string类的查找函数

10 string类的替换函数

11 string类的插入函数

12 string类的删除函数

13 string类的迭代器处理:

14 最简单的string类实现

1 从C到C++ string类

C语言的字符串函数,简单而高效。C++ string类,功能强大而复杂(对于我这样的人来讲,复杂了点)。简单的比较没有意义,只是在特定的情况下哪一个更适合的问题。

而在决定哪一个更适合之前,你可能需要明白:

A STL标准模板库中的string类使用异常来传递错误

B STL标准模板库中的string类,是一个具有写时才拷贝(Copy-On-Write)技术的类。Copy-On-Write使用了“引用计数“,在下列情况下会使用Copy-On-Write:1)以别的类构造自己,2)以别的类赋值

C 不必担心内存是否足够和字符串长度的同时,你必须放弃严格控制其内存申请释放的想法。

2 string类的构造函数

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的初值

3 string类的字符操作

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异常,下标运算符[]不提供检查访问。

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为起始位置的字符数组中,返回实际拷贝的数目

4 string的特性描述

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填充不足的部分

5 string类的输入输出操作

string类重载运算符operator>>用于输入,同样重载运算符operator<<用于输出操作。

函数getline(istream &in,string &s);用于从输入流in中读取字符串到s中,以换行符'/n'分开。

6 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迭代器之间的部分赋给字符串

7 string的连接

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之间的部分连接到当前字符串的结尾

8 string的比较

bool operator==(const string &s1,const string &s2)const;//比较两个字符串是否相等

运算符">","<",">=","<=","!="均被重载用于字符串的比较;

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的子串:

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

string的交换:

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

9 string类的查找函数

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::npos

int 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::npos

int 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相似,只不过是从后向前查找

10 string类的替换函数

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)之间的字符串

11 string类的插入函数

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

12 string类的删除函数

iterator erase(iterator first, iterator last);//删除[first,last)之间的所有字符,返回删除后迭代器的位置

iterator erase(iterator it);//删除it指向的字符,返回删除后迭代器的位置

string &erase(int pos = 0, int n = npos);//删除pos开始的n个字符,返回修改后的字符串

13 string类的迭代器处理:

string类提供了向前和向后遍历的迭代器iterator,迭代器提供了访问各个字符的语法,类似于指针操作,迭代器不检查范围。

用string::iterator或string::const_iterator声明迭代器变量,const_iterator不允许改变迭代的内容。常用迭代器函数有:

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实现

14 最简单的string类实现

#include<iostream>

using namespace std;

class String{

friend ostream& operator<< (ostream&,String&);

public:

String(const char* str=NULL);                //赋值构造兼默认构造函数(char)

String(const String &other);                 //赋值构造函数(String)

String& operator=(const String&other);       //operator=

String operator+(const String &other)const;  //operator+

bool operator==(const String&);              //operator==

char& operator[](unsigned int);              //operator[]

size_t size(){return strlen(m_data);};

~String(void) {delete[] m_data;}

private:

char *m_data;

};

inline String::String(const char* str)

{

if (!str) m_data=0;

else

{

m_data = new char[strlen(str)+1];

strcpy(m_data,str);

}

}

inline String::String(const String& other)

{

if(!other.m_data) m_data=0;

else

{

m_data=new char[strlen(other.m_data)+1];

strcpy(m_data,other.m_data);

}

}

inline String& String::operator=(const String& other)

{

if (this!=&other)

{

delete[] m_data;

if(!other.m_data) m_data=0;

else

{

m_data = new char[strlen(other.m_data)+1];

strcpy(m_data,other.m_data);

}

}

return *this;

}

inline String String::operator+(const String &other)const

{

String newString;

if(!other.m_data)

newString = *this;

else if(!m_data)

newString = other;

else

{

newString.m_data = new char[strlen(m_data)+strlen(other.m_data)+1];

strcpy(newString.m_data,m_data);

strcat(newString.m_data,other.m_data);

}

return newString;

}

inline bool String::operator==(const String &s)

{

if ( strlen(s.m_data) != strlen(m_data) )

return false;

return strcmp(m_data,s.m_data)?false:true;

}

inline char& String::operator[](unsigned int e)

{

if (e>=0&&e<=strlen(m_data))

return m_data[e];

}

ostream& operator<<(ostream& os,String& str)

{

os << str.m_data;

return os;

}

void main()

{

String str1="Hello!";

String str2="Teacher!";

String str3 = str1+str2;

cout<<str3<<"/n"<<str3.size()<<endl;

}

如果你还有兴趣,请查看STL中base_string 的源代码。

--刘黎明(liuliming2008@126.com)

参考资料:

标准C++类std::string的内存共享和Copy-On-Write技术 作者:陈皓    文章来源:纯C电子杂志 2005年1月号(总第3期)

http://www.zxbc.cn/html/cjjxt/1009360386165.html

http://blog.csdn.net/jixianghu/archive/2006/12/16/1445847.aspx

[C++]String类的实现  http://blog.csdn.net/freshare/archive/2006/01/23/586535.aspx

转载于:https://www.cnblogs.com/bigben0123/p/3713614.html

全面深入介绍C++字符串:string类相关推荐

  1. C#中的字符串, String类和StringBuilder类

    C#中的字符串, String类和StringBuilder类 1.简介 字符串对大多数计算机程序而言非常普遍. 像文字处理软件和网页应用程序这些程序类型 都广泛采用了字符串. 这使得处理这类应用程序 ...

  2. 最大质因数 最大回文数乘积 字符串String类用法_Java每日练习题及题解(11月16日)

    <Java每日练习题及题解>系列目录 1.有限条件求和_Java每日练习题及题解(11月15日) 2.最大质因数 最大回文数乘积 字符串String类用法_Java每日练习题及题解(11月 ...

  3. Java学习笔记(六)--字符串String类

    文章目录 字符串 一.String 类 1.1 声明字符串 1.2 创建字符串 二.连接字符串 2.1 连接多个字符串 2.2 连接其他数据类型 三.获取字符串信息 3.1 获取字符串长度 3.2 字 ...

  4. Java里的字符串, String类简单介绍.

    String类在java面试中也是1个常见的问题点. 所以也是写在这里方便以后查阅了. 大家都知道c语言里是没有String 字符串这个数据类型的. 只能用字符数组的1个特殊形式来表示一个字符串, 就 ...

  5. java语言用数组接收字符_Java基础——数组应用之字符串String类

    字符串String的使用 Java字符串就是Unicode字符序列,例如串"Java"就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准J ...

  6. 【C++ 语言】C++字符串 ( string 类 | 创建方法 | 控制台输出 | 字符串操作 | 栈内存字符串对象 | string* )

    文章目录 C++ 字符串 对象 C++ 字符串 对象 创建方法 C++ 字符串 对象 输出到控制台 C++ 字符串 拼接 C++ 字符串 方法调用 ( 栈内存对象 ) C++ 字符串 方法调用 ( 堆 ...

  7. 字符串string类使用总结

    一.String类的使用 字符串是Unicode字符的有序集合. String对象是System.Char对象的有序集合,可用索引器来访问字符. String类定义的变量是一个引用类型,可赋值为nul ...

  8. 【C++复习总结回顾】—— 【一】基础知识+字符串/string类

    文章目录 一.面向对象/过程 1. 面向过程过程 2. 面向对象编程 二.C++语言基础 1. 信息的存储单位 2. 命名空间 3. 基本数据类型 + 字符串 C++的基本数据类型 字符串处理 4. ...

  9. 字符串string类的使用:回文

    //字符串 回文 #include<iostream> #include<string> using namespace std; int main() {     strin ...

  10. java 格式化字符串_Java入门 - 语言基础 - 14.String类

    1.概述 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 2.创建字符串 创建字符串最简单的方式如下: String gr ...

最新文章

  1. 行人被遮挡问题怎么破?百度提出PGFA新方法,发布Occluded-DukeMTMC大型数据集 | ICCV 2019...
  2. Android中文API (110) —— CursorTreeAdapter
  3. 优化SQLServer--表和索引的分区(二)
  4. 如何使用悲观锁定修复乐观锁定竞争条件
  5. 条件变量实现线程同步
  6. Android App图片轮播效果的组件化
  7. java session 持久化_自定义实现session持久化
  8. oracle客户端 centos,Centos7-安装oracle客户端11.2.0.4
  9. Fiddler及浏览器开发者工具进行弱网测试
  10. 无法在驱动器0分区上安装windows 解决方法
  11. Mysql之事务与视图
  12. SQLite Developer破解 cmd 运行 reg delete HKEY_CURRENT_USER\SharpPlus\SqliteDev /v StartDate /f
  13. 计算机二级数据库题库百度云,计算机二级数据库试题及答案
  14. 使用SSH从服务器下载文件
  15. mac的hosts文件位置在哪?
  16. PX Deq Create send blkd
  17. 查询起止时间为同一天,需要查到当天数据
  18. 绿色荧光标记麦胚凝集素(FITC-WGA)
  19. 几种高特键轴的简单总结
  20. oracle dba_waiters中的lockid是什么,SQL Server和Oracle中的锁和死锁(三)

热门文章

  1. anki 插入表格_Anki+思维导图的两种方法(Anki+表格,Anki+幕布)
  2. linux文件系统选哪种,linux下几种文件系统的测试比较
  3. STM8学习笔记---IAR工程重命名
  4. 第一个SpringBoot项目——CRUD
  5. hihoCoder-1037-数字三角形(dp)
  6. pytorch:nn.Sequential讲解
  7. 学习Linux第一天
  8. 深度学习入门:10门免费线上课程推荐
  9. linux x64系统android开发环境搭建
  10. 终极解码播放mkv声音小的解决