【从零开始学c++】——string

2023-11-15

在这里插入图片描述

一.STL简介(了解)

1.什么是STL

STL(standard template libaray-标准模板库): 是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且
是一个包罗数据结构与算法的软件框架。,是一个高效的c++程序库

2.STL的六大组件

组件名称 说明
Container(容器) 各种基本数据结构 向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap),string
Adapter(适配器) 可改变containers、Iterators或Function object接口的一种组件 为已有的类提供新的接口,目的是简化、约束、使之安全、隐藏或者改变被修改类提供的服务集合
Algorithm(算法) 各种基本算法如sort、search…等 算法Algorithms,用来处理群集内的元素。它们可以出于不同的目的而搜寻、排序、修改、使用那些元素。通过迭代器的协助,我们可以只需编写一次算法,就可以将它应用于任意容器,这是因为所有的容器迭代器都提供一致的接口
Iterator(迭代器) 连接containers和algorithms 1.迭代器Iterators,用来在一个对象群集(collection of objects)的元素上进行遍历。这个对象群集或许是个容器,或许是容器的一部分。迭代器的主要好处是,为所有容器提供了一组很小的公共接口。迭代器以++进行累进,以*进行提领,因而它类似于指针
Function object(函数对象) 1、一个行为类似函数的对象,它可以没有参数,也可以带有若干参数。2.重载了调用运算符operator()的类的对象都满足函数对象的特征 3、STL中也定义了一些标准的函数对象,如果以功能划分,可以分为算术运算、关系运算、逻辑运算三大类。为了调用这些标准函数对象,需要包含头文件
Allocator(分配器) 负责空间配置与管理。从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的class template。

3.STL的缺陷

  1. STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出
    来已经相隔了13年,STL才进一步更新。
  2. STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。
  3. STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
  4. STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语
    法本身导致的。

2.string

1.string的简单了解

1. string是表示字符串的字符串类

  1. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类

  2. string在底层实际是: basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>
    string;
    在这里插入图片描述
    在这里插入图片描述

如何对stl的查阅

对stl的学习,我们需要掌握30%左右的接口函数,剩下的接口函数很少用,不需要记住,当我们需要去使用时,再去查阅,那么我们应该怎么去查阅这些接口函数,首先,我们给出两个网站:
一个是c++官网:https://en.cppreference.com/w/,它支持最新的语法,但它的界面比较乱
在这里插入图片描述
另一个是:http://www.cplusplus.com/reference/string/string/string/,它不是官网,它支持c++98和c++11,它的界面比较整洁和规范,容易看,所以推荐使用这个网站去查阅stl。下面我也会介绍怎样去查阅。下面我们以查string为例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后我们随便点一个接口函数:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. string常用接口说明

1.string类 对象常见的构造

在这里插入图片描述
在这里插入图片描述

2.string类对象的容量操作

在这里插入图片描述

void test
{
    string s1("hello world");
    cout << s.size() << endl;//输出11
    cout << s.capacity() << endl;//输出31
	s1.resize(20, 'x');//直接在hello world接9个x,size和capacity都会改变
	s1.resize(5);//只保留前5个字符,但capacity不变
	s1.clear();//将s1中的所有字符全部清空,将size清空为0,不改变capacity的大小

   string s2;
   s2.resize(20;//将s2中的有效字符增加到20个,为20个'\0'

  string s3;
  s3.reserve(20);//将capacity的大小改变为20,不改变size;
}	

总结;

  1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一
    致,一般情况下基本都是用size();

  2. clear()只是将string中有效字符清空,不改变底层空间大小。

  3. resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大
    小,如果是将元素个数减少,底层空间总大小不变。

  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于
    string的底层空间总大小时,reserver不会改变容量大小。

3. string类对象的访问及遍历操作

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
总结:
1.[begin(),end()) end()返回的是最后一个字符的下一个位置,c++中凡是给迭代器一般都是给的[)左闭右开的区间。

2.迭代器是类似指针一样的东西,迭代器以++进行累进,以*进行提领。

3.迭代器的意义:像string,vector支持[]遍历,但是list,map等等容器不支持[],迭代器能够使遍历的方式统一

4.迭代器是可读可写。const_iterator const对象 只能读不能写,const对象只能用const_iterator

4. string类对象的修改操作

在这里插入图片描述

void test
{
string s1;
	//尾插一个字符
	s1.push_back('h');
	s1.push_back('e');
	s1.push_back('l');
	s1.push_back('1');
	s1.push_back('o');
	cout << s1 << endl;//输出hello

    //尾插一个字符串
	s1.append("world");
	cout << s1 << endl;//输出helloworld


    //尾插一个字符串
	s1.append(s2);//或者s1.append(s2.begin(), s2.end());
	cout << s1 << endl;//输出helloworld!!!

    //尾插实际喜欢用+=
    s1 += ' ';
	s1 += "sjp";
	s1 += s2;
	cout << s1 << endl;//输出helloworld!!! sjp!!!

   //插入数据
   s1.insert(4," ");//在位置4插入一个空格
	cout << s1 << endl;//输出hello world!!! sjp!!!


   //插入不能越界,例如:
	//s1.insert(300, "yyyy");会报错

   //删除
   	s1.erase(0, 3);//从0位置开始,删除3个
	//s1.erase(0, 1000);//删多了,不会报错,把字符串全部删完
	s1.erase(3);//这个从3的位置后面全部删完
	s1.erase();//这个全部删完

    //假设要求取出文件名的后缀
	string filename1("test.cpp");
	size_t pos1 = filename1.find('.');//如果找不到,则返回npos

	if (pos1 != string::npos)
	{
		string suff(filename, pos1);
		cout << suff << endl;//输出cpp
	}


   string filename2("test.a.cpp");
   size_t pos2=filename2.rfind('.');//从后往前开始找,找不到则返回npos
   if (pos2 != string::npos)
	{
		string suff(filename, pos2);
		cout << suff << endl;//输出cpp
	}

}

获取一个网址的协议名和域名
在这里插入图片描述

string GetProtocol(const string& ur1)//获取协议名
{
	size_t pos = ur1.find("://");//find不仅可以查找字符也可以查找字符串
	if (pos != string::npos)
	{
		return ur1.substr(0, pos);//返回一个从0开始,pos个字符的字串
	}
	else
	{
		return string();//返回一个匿名对象,为空串
	}
}


string GetDomain(const string& ur1)//域名
{
	size_t pos = ur1.find("://");
	if (pos != string::npos)
	{
		size_t start = pos + 3;
		size_t end=ur1.find("/",start);//从start开始找”/"
		if (end != string::npos)
		{
			return ur1.substr(start,end-start);//从start开始截取end-start个字符
		}
		else
		{
			return string();//返回一个匿名对象,为空串
		}

	}
}


int main()
{
	string s1 = "https://daohang.qq.com/?fr=hmpage";
	string s2 = "http://www.cplusplus.com/reference/string/string/string/";
	
	cout<<GetProtocol(s1)<<endl;
	cout<< GetDomain(s1) <<endl;

	cout<<GetProtocol(s2)<<endl;
	cout<<GetDomain(s2)<<endl;

	return 0;
}

输出结果为:
在这里插入图片描述

注意:

  1. 在string尾部追加字符时,s.push_back© / s.append(1, c) / s += 'c’三种的实现方式差不多,一般
    情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
  3. 尽量少用insert,erase,因为底层实现是数组,头部或者中间要挪动数据,效率太低了。

感谢你的点赞和关注,收藏!!!!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【从零开始学c++】——string 的相关文章

  • 如何在Python中获得更精确的十进制值[重复]

    这个问题在这里已经有答案了 from math import sqrt a 1e 8 b 10 c 1e 8 x1 b sqrt b 2 4 a c 2 a x2 b sqrt b 2 4 a c 2 a print x1 format x
  • swig char ** 作为指向 char * 的指针

    我在使用 swig 和 char 作为指向变量 char 的指针时遇到问题 而不是作为 char 的列表 我找不到将指针包装到 char 的方法 目的是将连接的结果写入指针引用的 char 中 以下是我的代码 文件指针 cpp includ
  • pandas:使用运算符链接过滤 DataFrame 的行

    大多数业务在pandas可以通过操作符链接来完成 groupby aggregate apply等 但我发现过滤行的唯一方法是通过普通的括号索引 df filtered df df column value 这没有吸引力 因为它需要我分配d
  • django/whitenoise 存储后端导致错误

    我在调试关闭时在 heroku 上运行 django 应用程序时遇到了 500 错误 使用 rollbar 了解发生错误的原因后 它报告了以下内容 ValueError The file media img 1 jpg could not
  • 在python中浏览ftp目录

    我正在尝试使用 ftplib 使用 Python 3 从 ftp 服务器下载多个文件夹 我有一个文件夹名称列表 它们都位于文件夹 root 中 问题是我不知道如何浏览它们 当我使用cwd我可以进入更深的目录 但是如何再次起来呢 我正在尝试得
  • Python - 在先前已在全局范围内查找的函数内重新分配名称

    为什么我在下面的第三个代码中出现错误 但在前两个代码中却没有出现错误 我使用的是 Python 3 6 0 Anaconda 4 3 1 64 位 Jupyter Code 1 c 100 def fib c 20 a c print a
  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • 如何计算具有较大中间值的总和

    我想计算 for n m两个值都是 1000 以内的整数 最终结果是一个不大于 1000 的数字n但中间值对于 python 来说太大了 无法处理 你怎么解决这个问题 我将函数定义如下 from scipy misc import comb
  • 如何消除 matplotlib 轴的相对偏移

    当我尝试对具有足够大数字的范围进行绘图时 我得到一个所有刻度都有相对偏移的轴 例如 plot 1000 1001 1002 1 2 3 我在横坐标轴上得到这些刻度 0 0 0 5 1 0 1 5 2 0 1e3 问题是如何删除 1e3并得到
  • ctypes.ArgumentError:不知道如何转换参数

    我在C库中定义了一个函数 如下所示 int Test char str1 int id1 char str2 float val float ls 我想在Python中使用它 所以我编写了以下Python代码 str1 a str2 b i
  • Altair 条形图具有可变宽度的条形?

    我正在尝试在 Python 中使用 Altair 制作条形图 其中条形的宽度根据源数据帧列中的数据而变化 最终目标是获得如下所示的图表 条形的高度对应于每种能源技术的边际成本 在源数据框中以列形式给出 条形宽度对应于每种能源技术的容量 也以
  • 如何将文本文件中的十六进制行转换为数组(Python)?

    我有一个文本文件 每行包含一个十六进制明文 我的文件如下所示 7a8e5dc390781eab8df2c090bf4bebca dbac0fba55d3d4fc177161bfe24dc7fb 82e5a7a021197f6fbe94a86
  • 继承类中的python __init__方法[重复]

    这个问题在这里已经有答案了 我想为子类提供一些额外的属性 而不必显式调用新方法 那么有没有办法给继承的类一个 init 不重写的类型方法 init 父类的方法 我编写下面的代码纯粹是为了说明我的问题 因此属性等的命名很糟糕 class in
  • 在 matplotlib 中分割图例

    是否有可能将一个大图例分成多个 通常是 2 个 较小的图例 from pylab import t arange 0 0 2 0 0 01 s sin 2 pi t plot t s linewidth 1 0 label Graph1 g
  • Django 自定义查询集过滤器

    在 Django 中 是否有一种标准方法可以为查询集编写复杂的自定义过滤器 就像我能写的一样 MyClass objects all filter field val 我想做这样的事情 MyClass objects all filter
  • Python:如何访问 Lotus Notes 8.5 Inbox 来阅读电子邮件

    我想用 python 创建一个脚本 从 Lotus Notes 8 5 读取电子邮件 然后在 jira 中为每封电子邮件创建一个问题 但当我尝试从 Lotus 读取邮件时 它会返回此错误 Traceback most recent call
  • 如何使用 Python 3 在 OpenCV 3 上正确加载 cv2.KeyPoint 和描述符?

    有一天 我不得不恢复一个使用 OpenCV 3 和 Python 2 7 的旧项目 在此代码中 要加载 cv2 KeyPoint 我执行以下操作 import numpy as np import cPickle import cv2 ke
  • 带有 graphviz_layout 的水平树

    在Python中 使用networkx 我可以用以下方法绘制垂直树 g nx balanced tree 2 4 pos nx graphviz layout g prog dot nx draw g pos labels b all no
  • vtkPythonAlgorithm 控制管道执行

    我正在尝试用 python 编写一个 vtk 过滤器ProjectDepthImage进行投影不是问题 它控制 vtk 管道的执行 基本上 我对 UserEvent 有一个回调 当用户在渲染窗口处于活动状态时按下 u 键时会触发该回调 这将
  • Python 线程与 Linux 中的多处理

    基于此question https stackoverflow com questions 807506 threads vs processes in linux我假设创建新流程应该几乎和创造新线程在Linux中 然而 很少的测试显示出截

随机推荐

  • ProFrom套EditableProTable如何进行表单验证

    import React useRef from react import Button from antd import BetaSchemaForm DrawerForm ProCard from ant design pro comp
  • 解决win10中无法打开CHM文件的方法

    CHM文件是非常常见的帮助文件格式 由于其便携性 很多语言的API会采用chm格式 win7 win8 1 win10系统 由于采用了UAC 致使原本在xp里浏览正常的chm文件出现空白而无法正常显示 解决方法 右键选择需要打开的文件 选择
  • SpringBoot中运行测试:java.lang.NullPointerException

    问题展示 SpringBoot中运行测试类报 java lang NullPointerException 问题描述 提示 这里描述项目中遇到的问题 在SpingBoot中当我们在它原有的测试基类BaseSpringBootTest jav
  • 7年经验之谈 —— 如何高效的开展app的性能测试?

    APP性能测试是什么 从网上查了一下 貌似也没什么特别的定义 我这边根据自己的经验给出一个自己的定义 如有巧合纯属雷同 客户端性能测试就是 从业务和用户的角度出发 设计合理且有效的性能测试场景 制定各性能场景下的客户端性能指标 内存 CPU
  • 微信小程序服务器域名怎么填,微信小程序合法域名配置方法

    在微信小程序的开发过程中 当需要请求第三方网站数据时 各种教程就直接说调用wx request接口即可 但是当初学者自己用的时候就会出现问题 比如我们这里请求聚合数据的API 里边有不少免费的数据申请就可以使用 调用邮编查询的接口 getP
  • Mybatis嵌套查询与嵌套结果

    一对多关系 一是用户 多是订单 实体类User public class User private Integer id private String name private Integer age private List
  • 后台获取前端提交数据的GET、POST方法遇到的问题

    在写代码的时候 总发现前端数据获取不到 最后发现了问题是因为get和post要一起出现 缺一不可 protected void doGet HttpServletRequest request HttpServletResponse res
  • JavaWeb之添加数据,显示到页面

    需求 从jsp页面添加一条记录到数据库 且显示到界面 分析 创建jsp页面 创建EmailServlet gt addEmail方法 设置请求编码 获取所有parameter的值 封装对象 调用addEmail方法 重定向到email sh
  • 游戏开发unity杂项知识系列:SetActive使用注意

    static public void SetActive GameObject go bool state if go null return if go activeSelf state go SetActive state 项目中类似上
  • JSP语法:setProperty

    JSP语法 13 setProperty 时间 2009 03 21 20 37 来源 作者 CSDN IE QQ 百度 Google POCO 新浪 365Key 天极 和讯 博拉 Live 奇客 收客 饭否 叽歪
  • 互联网未来发展方向

    都知道马云带来了互联网以及互联网的高潮 随着国家推动一带一路经济带 以及国内互联网大局的发展 很明显未来是互联网的天下 而互联网将来会怎样哪 第一 网购或者终端购物成为主流 随着经济发展 社会文明进步 智能制造 智能社会越来越凸显 智能手机
  • Python和C语言哪个难?零基础学哪个好?

    Python和C语言哪个难 零基础学哪个好 Python上手简单有交互性强的开发环境 还有众多的第三方库 学习起来会比C C 容易的多 C过于底层强在内存操作 功能实现起来却十分复杂并不适合新手作为上手语言 Python和C语言各有各的优势
  • Elastic Search 学习笔记

    来自尚硅谷 ES 教程 背景知识 从MySQL 到 ES 这一小节是我的一点点理解 如果有不对的话 欢迎指正 ES 是一个开源的高扩展的分布式全文搜索引擎 这样讲似乎还是有点抽象 那我们用一个更加熟悉的东西 MySQL来辅助理解 既然是搜索
  • 程序员技术面常用知识点

    转自 http blog csdn net qq 15437629 article details 52388685 在这里只做备份 计算机网络 TCP IP 模型 TCP IP协议集的分层实施 为什么要给网络划分层次 1 各层之间相对独立
  • 接口(interface)的实现

    接口 interface 的实现 usb插槽就相当于现实中的接口 其实现实生活和编程相对应的 即程序就是事件 1 java中的接口是怎么实现的呢 接口就是给出一些没有实现的方法 到了某个类要使用的时候就去实现他 语法 interface 接
  • Python多层字典取值

    usr bin python coding utf 8 author Bingo he file get target value py time 2017 12 22 def get target value key dic tmp li
  • 对于vue项目整理增删改查

    模板是来源于官方文档 清除tabledata里的模拟数据先
  • Pytorch相关操作(2)

    PyTroch相关操作 1 21 torch cuda Event 记录GPU的运行时间 start torch cuda Event enable timing True end torch cuda Event enable timin
  • Android Handler 的基本使用

    1 前言 https developer android google cn reference android os Handler html Handler 是 Android 中线程通信的常用方式 文档如是说 A Handler al
  • 【从零开始学c++】——string

    学好STL 一 STL简介 了解 1 什么是STL 2 STL的六大组件 3 STL的缺陷 2 string 1 string的简单了解 如何对stl的查阅 2 string常用接口说明 1 string类 对象常见的构造 2 string