目录

前言

1、构造函数

2、size()

3、length()

4、maxsize()

5、capacity()

6、reserve()

7、resize()

8、获取元素at()

9、字符串比较compare()

10、assign()

11、operator=

12、erase()

13、swap()

14、insert()

15、append()

16、replace()

17、输入getline()

18、查找函数

  find(),rfind()

  find_first_of() / find_last_of()

  find_first_not_of()函数和 find_last_not_of()函数

19、迭代器

20、配置器

21、substr()


不用担心内存、长度。

#include <string>

basic_string 是C++标准库中的字符串模板类。我们一般使用的string其实就是basic_string<char>, wstring是basic_string<wchar>

string对象的元素是char型,string型对象可以直接和char型变量相加,得到string型对象。

1、构造函数

string str ("");
char ch[] = "abcdefgh"; string a; //定义一个空字符串 string str_1 (str); //构造函数,全部复制,12345678 string str_2 (str, , ); //构造函数,从字符串str的索引2开始,复制5个元素,赋值给str_2,即34567 string str_3 (ch, ); //将字符串ch的前5个元素赋值给str_3,即abcde string str_4 (,'X'); //将 5 个 'X' 组成的字符串 "XXXXX" 赋值给 str_4 string str_5 (,); //10个字符"*",就是10个asic码为42的字符 string str_6 (str.begin(), str.end()); //复制字符串 str 的所有元素,并赋值给 str_6 string str_7 (str.begin().str.begin()+);//复制的是begin开始的7个元素,也就是区间(begin,begin+6)的元素

2、string.size()

获得字符串的长度

3、string.length()

获得字符串的长度

4、string.max_size()

返回 string 类型对象最多包含的字符数。一旦程序使用长度超过 max_size() 的 string 操作,编译器会拋出 length_error 异常。

5、string.capacity()

返回在重新分配内存之前,string 类型对象所能包含的最大字符数,每个string类型对象刚开始分配capacity个字符数,capacity的上限是max_size。

6、string.reserve(num)

为容器预留足够的空间,避免不必要的重复分配,影响capacity。

7、string.resize(num)

调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉。若尺寸变大,不够的数据用该函数第二个参数填充,影响size。

8、获取元素at()

访问元素可以使用下标操作符[] 和 成员函数at()。两者均返回指定的下标位置的字符。

下标操作符 [] 在使用时不检查索引的有效性,如果下标超出字符的长度范围,会示导致未定义行为。

函数 at() 在使用时会检查下标是否有效。如果给定的下标超出字符的长度范围,系统会抛出 out_of_range 异常。

9、字符串比较compare()

字符串可以和类型相同的字符串相比较,也可以和具有同样字符类型的数组比较。返回一个整数来表示比较结果。如果相比较的两个子串相同,compare() 函数返回 0,否则返回非零值。

int res = str1.compare(str2);
int res = str1.compare(str1_pos,str1_len,str2)
int res = str1.compare(str1_pos,str1_len,str2,str2_pos,str2_len) string A ("aBcdef");
string B ("AbcdEf");
string C ("");
string D ("123dfg"); //下面是各种比较方法
int m=A.compare (B); //完整的A和B的比较
int n=A.compare(,,B); //"Bcdef"和"AbcdEf"比较
int p=A.compare(,,B,,); //"Bcdef"和"Ef"比较
int q=C.compare(,,D,,); //"123"和"123"比较

10、assign()

string A ("aBcdef");
string B ("AbcdEf"); int res = str1.compare(str2);
int res = str1.compare(str1_pos,str1_len,str2)
int res = str1.compare(str1_pos,str1_len,str2,str2_pos,str2_len) //下面是各种比较方法
int m=A.compare (B); //完整的A和B的比较
int n=A.compare(,,B); //"Bcdef"和"AbcdEf"比较
int p=A.compare(,,B,,); //"Bcdef"和"Ef"比较

11、operator=

符号“=”就是赋值

12、erase()

iterator erase(str.begin(),str.begin()+);//删除begin开始的2个元素,也就是前两个元素吗,返回下一个元素的迭代器位置
iterator erase(num);//只保留前num个元素 str.erase(str.begin(),str.end());

13、swap

交换两个字符串的内容

string str1("aaaaa");
string str2("bbbbb");
str1.swap(str2);//交换这个string变量的内容
//此时str1:bbbbb
// str2 : aaaaa

14、insert()

string insert(pos,n,char);//在pos位置插入n个char字符
string str = "meihao";
string sstr = str.insert(,,'a');//aameihao string insert(index,const CharT*);//index位置插入一个常量字符串
string str = "meihao";
string sstr = str.insert(,"hello~");//mhello~eihao string insert(index,const string);//index位置插入常量string
string str = "meihao";
string sstr = str.insert(,str);
cout<<sstr<<endl; //mmeihaoeihao string insert(index,const char*,n);//index位置插入常量字符串中的count个字符
string str = "meihao";
string sstr = str.insert(,"hello~",);
cout<<sstr<<endl; //mheleihao string insert(index,const string,index_str,count);index位置插入常量str的从index_str开始的count个字符
string str1 = "meihao";
string str2 = "hello~";
string sstr = str2.insert(,str1,,);
cout<<sstr<<endl; //hello~hao string insert(index,const string,index_str,string::npos);//index位置插入常量str从index_str开始的count个字符,count可以表示的最大值为npos.这个函数不构成重载
string str1 = "meihao";
string str2 = "hello~";
string sstr = str2.insert(,str1,,string::npos);
cout<<sstr<<endl; //hello~hao
cout<<string::npos<<endl; // iterator insert(iterator pos,char);//pos位置之前插入一个字符char,返回迭代器
string a("aaa");
string::iterator it = a.insert(a.begin(),'a');
cout<<a<<endl;//aaaa
cout<<*it<<endl;//a void insert(iterator pos,count,char);//迭代器指向的pos位置插入count个字符ch
string str1 = "meihao";
str1.insert(++str1.begin(),,'a');
cout<<str1<<endl; //maaeihao void insert( iterator pos, InputIt first, InputIt last );
str1.insert(str1.end(),str2.begin(),str2.end()); iterator insert( const_iterator pos, InputIt first, InputIt last );
string str1 = "meihao";
string str2 = "hello";
//string::iterator it = str1.insert(str1.begin(),str2.begin(),str2.end());
string::iterator it = str1.insert(str1.begin(),std::begin(str2),std::end(str2));
cout<<str1<<endl; //hellomeihao
cout<<*it<<endl; //h

15、append()

string a("aaa");
string append(s);//在原始字符串后面追加字符串s
string append(s,n);//在原始字符串后面追加字符串 s 的前 n 个字符
string append(s,pos,n);//在原始字符串后面追加字符串s的字串,s的pos位置后的n个字符,即区间[pos,pos+n-1]
string append(n,char);//追加 n 个重复字符
string append(iterator first,iterator last);//使用迭代器追加,将字符串s的first到last的字符追加到string后面

16、replace()

字符串内容的替换。

string& replace (size_t pos, size_t len, const string& str); //pos位置开始的len个字符替换为str

string& replace (const_iterator i1, const_iterator i2, const string& str);//用str替换 迭代器起始位置 和 结束位置 的字符 

string& replace (str_pos,str_len,s,s_pos,s_len);//将str的pos位置开始的str_len个字符替换为s的s_pos位置开始的s_len个字符

17、输入getline()

该函数可将整行的所有字符读到字符串中。在读取字符时,遇到文件结束符、分界符、回车符时,将终止读入操作,且文件结束符、分界符、回车符在字符串中不会保存;当已读入的字符数目超过字符串所能容纳的最大字符数时,将会终止读入操作。

string str;
getline(cin,str);
getline(cin,str,' ');//第 1 个参数是输入流,第 2 个参数保存输入的字符串,第 3 个参数指定分界符

18、查找函数

查找 find() 函数和其他函数没有搜索到期望的字符(或子串),则返回 npos;若搜索成功,则返回搜索到的第 1 个字符或子串的位置。其中,npos 是一个无符号整数值,初始值为 -1。当搜索失败时, npos 表示“没有找到(not found)”或“所有剩佘字符”。

(1)find()/rfind()

find(char,pos);//在pos位置开始搜索char字符
find(s,pos);//在pos位置搜索s字符串
find(s,pos,n);//在pos位置搜索s字符串的前n个字符的子字符串

rfind()适用于实现逆向查找。

(2)find_first_of() / find_last_of()

find_first_of() 函数可实现在源串中搜索某字符串的功能,该函数的返回值是被搜索字符串的第 1 个字符第 1 次出现的下标(位置)。若查找失败,则返回 npos。

find_last_of() 函数同样可实现在源串中搜索某字符串的功能。与 find_first_of() 函数所不同的是,该函数的返回值是被搜索字符串的最后 1 个字符的下标(位置)。若查找失败,则返回 npos。

(3)find_first_not_of()函数和 find_last_not_of()函数

find_first_not_of() 函数可实现在源字符串中搜索与指定字符(串)不相等的第 1 个字符;find_last_not_of() 函数可实现在源字符串中搜索与指定字符(串)不相等的最后 1 个字符。这两个函数的参数意义和前面几个函数相同,它们的使用方法和前面几个函数也基本相同。

19、迭代器

STL 定义了 5 种迭代器,根据所需的迭代器类型对算法进行描述。这 5 种迭代器分别是:输入迭代器、输出迭代器、正向迭代器、双向迭代器和随机访问迭代器。

对于这 5 种迭代器不仅可以执行解除引用操作(* 操作符),还可进行比较。本节主要讲述 basic_string(或 string 类)中迭代器的使用。

string 类中和使用迭代器相关的成员函数是很多的,主要包括 begin()、end()、rbegin ()、rend()、append()、assign()、insert()、erase()、replace() 等。

20、配置器

配置器的作用就是为容器分配内存。

所以使用内存配置器分配内存时,是按对象的个数进行的,而不是按字节数。

21、substr()

int main()
{
  string s("abcdefghigklmn");
  string a = s.substr(,); //获得字符串s中从第0位开始的长度为5的字符串
  cout << a << endl;
}

输出abcde

s1 = s.sbustr(pos,n);

返回一个string,从pos开始的n个字符拷贝到s1。

pos默认0,n的默认值是s.size() - pos,如果pos+n超出了字符串长度,就只拷贝到s的末尾;

若pos超过了字符串的长度,抛出异常

序列式容器————string的更多相关文章

  1. 7.5 C++基本序列式容器

    参考:http://www.weixueyuan.net/view/6402.html 总结: vector可以理解为可以在两端插入.删除数据的数组,它提供了丰富的成员函数,用于操作数据. begin ...

  2. STL学习笔记(序列式容器)

    Vector Vector是一个动态数组. 1.Vector的操作函数 构造.拷贝和析构 vector<Elem> c //产生一个空vector ,其中没有任何元素 vector< ...

  3. STL源码剖析读书笔记--第四章--序列式容器

    1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...

  4. STL源码剖析之序列式容器

    最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...

  5. STL序列式容器学习总结

    STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...

  6. STL——序列式容器

    一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...

  7. vector是序列式容器而set是关联式容器。set包含0个或多个不重复不排序的元素。

    1.vector是序列式容器而set是关联式容器.set包含0个或多个不重复不排序的元素.也就是说set能够保证它里面所有的元素都是不重复的.另外对set容器进行插入时可以指定插入位置或者不指定插入位 ...

  8. STL源码剖析——序列式容器#1 Vector

    在学完了Allocator.Iterator和Traits编程之后,我们终于可以进入STL的容器内部一探究竟了.STL的容器分为序列式容器和关联式容器,何为序列式容器呢?就是容器内的元素是可序的,但未 ...

  9. 数据结构-STL序列式容器总结

    根据序列在容器中的排列特性,将常见数据结构分为:序列式容器和关联式容器. 常见序列式容器有 1.array(build-in)c++內建 2.vector 3.heap(以算法方式呈现) 4.prio ...

随机推荐

  1. Java作业 题目:16版.情人节送玫瑰花

    题目:16版.情人节送玫瑰花 题干: 1.实验要求 本实验要求:以情人节送花为业务背景,体验自定义异常以及异常处理机制. 1-1. 业务说明: 1-1.1. 本实验以情人节送花为业务背景,女方提出送花 ...

  2. HDU 1401 Solitaire 双向DFS

    HDU 1401 Solitaire 双向DFS 题意 给定一个\(8*8\)的棋盘,棋盘上有4个棋子.每一步操作可以把任意一个棋子移动到它周围四个方向上的空格子上,或者可以跳过它四个方向上的棋子(就 ...

  3. laravel修改用户模块的密码验证

    做项目的时候,用户认证几乎是必不可少的,如果我们的项目由于一些原因不得不使用 users 之外的用户表进行认证,那么就需要多做一点工作来完成这个功能. 现在假设我们只需要修改登录用户的表,表名和表结构 ...

  4. Layui关闭弹出层并刷新父窗口

    先确保已经引入layui和jquery 再确保初始化layer弹出层 <script> layui.use(['form', 'layer'], function() { var form ...

  5. sys模块&json模块&pickle模块

    sys模块&json模块&pickle模块 sys模块 一.导入方式 import sys 二.作用 与Python解释器交互 三.模块功能 3.1 经常使用 sys.path #返回 ...

  6. mysql数据库常见错误代码列表

    mysql出错代码列表1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1 ...

  7. Asp.net Core中文转换成拼音

    一.概述 之前使用.net framework,可以使用Microsoft Visual Studio International Feature Pack 1.0 进行转换,现在使用asp.net ...

  8. 剑指offer-字符串的排列-数组-递归-动态规划-python

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  9. wex5 如何在js中给data添加数据

    var options = { defaultValues :[ {'xuetang' : xuetang,'time' : time} ] }; this.comp("xuetangDat ...

  10. scala学习笔记(1)

    scala ------------------------- java语言脚本化 1.安装scala-2.12.1.msi 2.进入到scala的命令行 3.Tab键会有补全的功能 1.scala程 ...