C++ STL主要组件之String总结(第一部分,构造和操作)

最近在学习C++时,进入到了STL的学习阶段,在发现到这个部分的重要性时,我打算把对STL的学习分步骤记录下来,我首先打算学习的是组件String的部分,此文章主要只记录内部构造和对象基本操作。

STL是由C++提供的标准模板库,内含多个主要组件,此次总结的是String部分的内容。String在STL中算是较为重要的部分,所以需要我重点攻克。

先放一张我学习String后对于此部分知识点的概括。

首先是第一部分:

一.标准库中的String类都有哪些内容

首先是String中包含的接口:
其实这一部分要理解还是不难的,因为这些功能性的函数之前大都或多或少的编写过。
1.构造函数
(1)无参构造函数
string()//构造空的string对象,一个空字符串
eg:

string s1;//构造空的String类对象s1

(2)带参构造函数
此时常见构造函数就不止一种了
①参数为c风格字符串
string(const char * s)
eg:

string s2(“hello”);//使用C风格字符串构造的String类对象

②构造的对象中包含n个字符c
string(size_t n,char c)
eg:

string s3(10,‘n’);//构造的对象为字符串“nnnnnnnnnn”

③拷贝构造(使用相同类的对象来构造新的类对象)
string(const string& s)
eg:
string s4(s3);

2.String类对象对于容量的操作
这一部分其实要去全部学习其实是效率不高的,如下图

(图片来源cplusplus.com)
所以主要选取其中使用较为频繁的几种(size,empty,clear,reserve,resize)来主要学习便可。
(1)size
size函数会返回当前对象的有效字符长度
eg:

string s;
cout << s.size();

(2)empty
empty会检测当前字符串是否已释放为空串,是的话返回true,否的话返回false
eg:

string s;
if(s.empty()){
return 0;
}

(3)clear
clear会清空当前对象的有效字符,但不会改变底层空间大小
eg:

string s;
s.clear();

(4)resize( size_t n, char c )
resize会修改当前对象有效字符个数,多出的部分会使用字符c填充
若是修改后有效字符长度小于之前,则多出的部分将被截掉
eg:

string s;
s.resize(20,‘w‘);


需要注意的点有:

<1>如果是将string类中的有效元素缩小,只改变有效元素个数,不会改变底层空间大小
<2>如果是将string类中的有效元素增多,可能需要扩容(改变底层空间大小)

(5)reserve( size_t newcapacity )
reserve会修改当前对象底层空间大小,但不会修改有效字符个数
当newcapacity > oldcapacity(string类旧空间大小)时,进行扩容
若是newcapacity < oldcapacity 时,函数直接返回,不作任何修改
eg:

string s;
reserve(20);

需要注意的点:
在不同环境下,reserve进行扩容的大小是不一样的(当对象字符串长度小于15时,初始分配底层空间大小为15):
例如:在vs平台下扩容大小大约是原来的1.5倍
但是在linux下扩容大小就是原来的2倍

最后是容量操作中的小点:
size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致(函数返回值也完全相同)

3.对于string类对象的访问方法
(1)对于指定位置的的访问
在对象操作中,这样的访问通常使用operator[ ]来进行(类似于访问数组元素的操作)
eg:

string s(“hello”);
cout << s[0];

输出结果:
h
(2)使用遍历方法访问(或修改)
在C++中,此处我们一共可以使用3中遍历方法(ps:I like it!O(∩_∩)O)
<1>使用for循环加operator[ ]的方式遍历字符串
eg:

string s(“beat it”);
for(size_t i=0;i<=s.size();++i)
cout << s[ i ];

<2>使用迭代器的方法遍历
注意:
①标准库容器都可以使用迭代器
②begin()方法负责返回指向第一个元素的迭代器,end()方法负责返回指向容器尾元素的下一个位置的迭代器
③如果容器为空,则begin和end返回的是同一个迭代器
④rbegin()返回一个逆向迭代器,指向字符串的最后一个字符,rend()函数返回一个逆向迭代器,指向第一个字符的前一个位置,具体位置为下图:

(图片来源于网络)

eg:

string::iterator it = s.begin();
 while(it != s.end())
 {
 cout<<*it<<endl;
 ++it;       //指向元素位置移动如上图
 }

 string::reverse_iterator rit = s.rbegin(); //此处为反向迭代器的使用
 while(rit != s.rend())
 {
 cout<<*rit<<endl;
++rit;     //指向元素位置移动如上图
}

<3>使用范围for方法遍历
eg:

for(auto c : s)
cout << c << endl;

4.对于string类对象的内容修改操作

string类中常用的此类操作有如下几种:

  • push_back --在字符串后尾插字符c
    eg:

    string s1;
    s1.push_back(‘I‘);
  • append --在字符串后追加一个字符串(使用方法有很多种,如下图)

    eg:
    常用的两种:
    s1.append("祖国");   //图中第一种
    s1.append(3, ‘!‘);    //图中第五种
  • operator+= -- 在字符串后追加字符串str
    eg:
    s1 += " Love ";
  • c_str --返回C格式字符串
  • find + npos --从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
    eg:
    size_t pos = s.find ( ‘ c ‘ ) ;
    if ( pos != string : : npos )
    {
        cout  <<  ‘c‘  <<  " is in s" << pos << endl;
    }

    注意:
    find方法在字符串s中查找字符c,若是找到返回该字符在字符串中的位置,若是没有找到则返回npos
    npos是string类定义的一个静态成员变量,保证其值大于任何有效的下标的值,可看成一个整数-1

  • rfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置....(其他同find)
  • substr 在str中从pos位置开始,截取n个字符,然后将其返回
    eg:
    substr(pos,n);
    substr(pos); //截取从pos到字符串结尾

同样只对其中较为重要的几种(operator+=、c_str、find+npos)进行重点记忆,其他几种了解即可。

5.对于string类的非成员函数
此处只是说明作用:

  • operator+ 尽量少用,因为传值返回,导致深拷贝效率低
  • operator>> (重点) 输入运算符重载
  • operator<< (重点) 输出运算符重载
  • getline (重点) 获取一行字符串
  • relational operators (重点) 大小比较

标明重点部分需要掌握使用,在在线OJ将会用到

以上就是关于String第一部分的总结,附上一张收尾图:

原文地址:https://blog.51cto.com/14232799/2447326

时间: 2024-08-06 00:17:26

C++ STL主要组件之String总结(第一部分,构造和操作)的相关文章

C++ STL主要组件之String总结(第二部分 深、浅拷贝问题以及赋值运算符重载)

第一部分连接https://blog.51cto.com/14232799/2447326 二.String的模拟实现 在第一步之后紧接着的就该是模拟实现部分,这一部分主要是体现自己对第一部分的掌握情况.强烈推荐和我一样在学习String的朋友们自己动手实现一下.因为在面试中,面试官总喜欢让我们自己来模拟实现string类. 自己来实现String最主要是实现String类的构造.拷贝构造.赋值运算符重载(第一部分operator开头的方法)以及析构函数. 以下是我完成的基础模拟实现 #incl

重温《STL源码剖析》笔记 第一章

源码之前,了无秘密. --侯杰 经典的书,确实每看一遍都能重新收获一遍: 第一章:STL简介 STL的设计思维:对象的耦合性极低,复用性极高,符合开发封闭原则的程序库. STL的价值:1.带给我们一套极具实用价值的零部件,以及一个整合的组织. 2.带给我们一个高层次的以泛型思维为基础的.系统化的.条理分明的“软件组件分类学”. 在STL接口之下,任何组件都有最大的独立性,并以所谓迭代器胶合起来,或以配接器互相配接,或以所 谓仿函数动态选择某种策略. STL六大组件:1.容器(containers

C++ Primer 学习笔记_46_STL剖析(一):泛型程序设计、什么是STL、STL六大组件及其关系

一.泛型程序设计 1.泛型编程(generic programming):相同的逻辑和算法,对不同类型的数据进行处理 2.将程序写得尽可能通用 3.将算法从数据结构中抽象出来,成为通用的 4.C++的模板为泛型程序设计奠定了关键的基础 二.什么是STL 1.STL(Standard Template Library),即标准模板库,是一个高效的C++程序库. 2.包含了诸多在计算机科学领域里常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性 3

STL学习笔记(string)

动机 C++标准程序库中的string class使我们可以将string当做一个一般型别.我们可以像对待基本型别那样地复制.赋值和比较string, 再也不必但系内存是否足够.占用的内存实际长度等问题. 操作函数 1.构造函数和析构函数 下表列出string的所有构造函数和析构函数 2.大小和容量 size()和length():返回string中现有的字符个数. max_size():返回一个string最多能够包含的字符数,这个跟机器本身的限制有关系. capacity():重新分配内存之

Java使用Aspose组件进行多文档间的转换操作

什么是Aspose? Aspose.Total是Aspose公司旗下的最全的一套office文档管理方案,主要提供.net跟java两个开发语言的控件套包,通过它,我们可以有计划地操纵一些商业中最流行的文件格式:Word, Excel, PowerPoint, Project,等office文档以及PDF文档. 除了强大的文件操纵组件之外,Aspose.Total 还提供了用于制图.写电子邮件.拼写检查.创建条形码.生成ad hoc 查询.重现格式以及工作流等组件,运用它我们可以整理一个完整的文

c++ STL中的vector与list为什么没有提供find操作?

map里有,set里也有,vector,list没有,太不公平了吧. 其实应该考虑为什么map,set里有find操作. include<algorithm>里有通用的find操作,通用的find内部是从begin到end进行一次遍历,复杂度是O(n). 通过iterator从begin到end遍历map与set时,得到的结果是按key排序的结果,而不是插入时的顺序(所以这两个容器没有push_back操作), 其实,insert到map与set中的元素会被组织到一颗红黑树上,红黑树是一颗平衡

通过SSIS的“查找”组件进行不同数据源之间数据的合并操作

原文:通过SSIS的"查找"组件进行不同数据源之间数据的合并操作 为了协助开发还原生产环境中的某些bug,需要将将生产环境的某些特定表数据导入到测试环境做测试,之前一直都是暴力地truncate测试环境的表,然后用SSIS将生产环境对应的整张表数据导入测试环境,简便快捷后来开发提出来,保留测试环境已有的数据,只同步差异的数据(根据主键),于是就尝试使用SSIS中的“查找”组件进行不同服务器之间的“存在则更新,不存在则插入”数据合并操作,实际操作的时候只执行插入操作,达到同步数据的目的.

hdu 5008 Boring String Problem(后缀自动机构造后缀树)

hdu 5008 Boring String Problem(后缀自动机构造后缀树) 题意:给出一个字符串s,然后每次询问一个k,求s的所有子串中,字典序第k小的是谁?多个解,则输出最左边的那个 解题思路:这道题应该是为后缀树量身定制的吧.只要构造出了后缀树,然后按字典序遍历就可以得出每个节点包含的子串的字典序的范围了,而且必然是个连续的区间范围.但是我不会后缀树啊..比赛的时候突然想到,后缀自动机是可以构造后缀树的,虽然以前没写过,但还是硬着头皮上吧,居然还真的让我给撸出来了.我的做法是这样的

Effective STL:02vector和string

在STL容器中,vector和string的使用频率会更高一些.设计vector和string的目标就是为了替换大多数应用中要使用的数组. 13:vector和string优先于动态分配的数组 一旦要使用new动态分配数组,将要面临很多问题:必须确保delete.必须使用正确的delete形式:必须保证只delete一次.每当发现自己要动态分配一个数组时,都应该考虑用vector和string来代替.vector和string 消除了上述的负担,因为它们自己管理内存.如果你担心还得继续支持旧的代