7.string

news2024/11/16 15:28:53

目录

学库一定会看文档

1.Member functions

string介绍

2.迭代器iterator

1.正向迭代器

2.反向迭代器

3.反向const

4.反向const

3.容量capacity

0.size(),capacity(),max_size(),length()

1.扩容机制(vs和Linux g++对比)

2.clear()

2.1缩容shrink_to_fit()

3.reserve(扩容)

4.resize()

4.Element access:

1.捕获某个字符

2.取头尾字符

 5.Modifiers

1.push_back(字符)

​编辑

2.append(字符串)

3.operator+=

4.assign(基本用不着)

5.insert

6.erase

7.replace

8.pop_back(c++11)

6.String operations


学库一定会看文档

下面推荐个网站

cplusplus.comicon-default.png?t=N7T8https://cplusplus.com/

std::string

Strings are objects that represent sequences of characters.

strings 是表示字符序列的对象。

1.Member functions

string介绍

default (1)
string();
copy (2)
string (const string& str);
substring (3)
string (const string& str, size_t pos, size_t len = npos);

复制从字符位置pos开始并跨越len个字符的str部分(或者直到str的结尾,如果str太短或len为string::npos

from c-string (4)
string (const char* s);

复制由指针s指向的以空字符结尾的字符序列(C字符串)

from sequence (5)
string (const char* s, size_t n);

从指向s的字符数组中复制前n个字符

fill (6)
string (size_t n, char c);
range (7)
template <class InputIterator>
  string  (InputIterator first, InputIterator last);

(先不看)

void teststring()
{
	string s0;
	string s1("hello world");
	string s2(s1);
	string s3(s1, 5, 3);
	string s4(s1, 5, 10);
	string s5(s1, 5);

	cout << "s0" << s0 << endl;
	cout << "s1" << s1 << endl;
	cout << "s2" << s2 << endl;
	cout << "s3" << s3 << endl;
	cout << "s4" << s4 << endl;
	cout << "s5" << s5 << endl;

	string s6(10, '#');
	cout << s6 << endl;

	s0 = s6;
	cout << s0;
}

2.迭代器iterator

1.正向迭代器

关键:begin()

           end()

void stringtest()
{
	string s1("hello lInux");
	string::iterator it1 = s1.begin();
	while (it1 != s1.end())
	{
		cout << *it1 << " ";
		++it1;
	}
}

迭代器遍历vector

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	vector<int>::iterator it2 = v.begin();
	while (it2 != v.end())
	{
		cout << *it2;
		it2++;
	}

范围for

	for (auto e : s1)
	{
		cout << e;
	}
	cout << endl;
	for (auto e : v)
	{
		cout << e;
	}
	cout << endl;

2.反向迭代器

reverse_iterator

rbegin()

rend()

//反向迭代器
void stringtest1()
{
	string s1("hello world !");
	string::reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
}

特别注意:底层不是这样的!!!!!!!!!!!!

3.反向const

void stringtest1()
{
	const string s1("hello world !");
	string::const_reverse_iterator rit = s1.rbegin();
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
}

4.反向const

void stringtest1()
{
	const string s1("hello world !");
	string::const_iterator rit = s1.begin();
	while (rit != s1.end())
	{
		cout << *rit << " ";
		++rit;
	}
}

3.容量capacity

0.size(),capacity(),max_size(),length()

	//string s1("hello world!");
	//cout << s1.size() << endl;    
	//cout << s1.length() << endl;
	//cout << s1.max_size() << endl;
	//cout << s1.capacity() << endl;

1.扩容机制(vs和Linux g++对比)

	int i = 0;
	for (i = 0; i < 100; i++)
	{
		s.push_back('c');
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "capacity changed : " << sz << '\n';
		} 
	}

g++下面的 (2倍扩容)

 vs下面的(除了第一个其他都是1.5倍扩容)

2.clear()

	string s1("hello world!");
	cout << s1 << endl;
	cout << s1.capacity() << endl;
	s1.clear();     
	cout << s1 << endl;   
	cout << s1.capacity() << endl;

clear只清数据,不清空间

capacity 没有变化

2.1缩容shrink_to_fit()

3.reserve(扩容)

    s.reserve(100);

Linux下面

vs下面

总结:reserve只有比capacity大才起作用

4.resize()

10  删除                   <size

20  插入                   size < n < capacity

40  扩容+插入          capacity < n

void stringtest4()
{
	string s1("hello world !!!");
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;

	s1.resize(10);
	cout << s1.size() << endl;
	cout << s1.capacity() << endl <<endl;

	s1.resize(20);
	cout << s1.size() << endl;
	cout << s1.capacity() << endl << endl;

	s1.resize(100,'x');
	cout << s1.size() << endl;
	cout << s1.capacity() << endl << endl;


}

4.Element access:

string::operator[]

1.捕获某个字符

(1)[]

(2)at()

2.取头尾字符

void test1()
{
	string s1("helloworld!");
	cout << s1[5] << endl;
	cout << s1.at(5) << endl;
	cout << s1.front() << endl;
	cout << s1.back() << endl;
}

 5.Modifiers

1.push_back(字符)

void push_back (char c);

2.append(字符串)

string (1)
string& append (const string& str);
substring (2)
string& append (const string& str, size_t subpos, size_t sublen);
c-string (3)
string& append (const char* s);
buffer (4)
string& append (const char* s, size_t n);
fill (5)
string& append (size_t n, char c);
range (6)
template <class InputIterator>
   string& append (InputIterator first, InputIterator last);
void test2()
{
	string s1("hello world");
	s1.push_back('!');
	cout << s1 << endl;
	s1.append("hwh");
	cout << s1 << endl;

	s1.append(10, 'x');
	cout << s1 << endl;

	string s2(" apple ");
	//s1.append(s2);
	//cout << s1 << endl;

	s1.append(++s2.begin(),--s2.end());  //不想要空格
	cout << s1 << endl;
}

3.operator+=

string (1)
string& operator+= (const string& str);
c-string (2)
string& operator+= (const char* s);
character (3)
string& operator+= (char c);

4.assign(基本用不着)

string (1)
string& assign (const string& str);
substring (2)
string& assign (const string& str, size_t subpos, size_t sublen);
c-string (3)
string& assign (const char* s);
buffer (4)
string& assign (const char* s, size_t n);
fill (5)
string& assign (size_t n, char c);
range (6)
template <class InputIterator>
   string& assign (InputIterator first, InputIterator last);

5.insert

string (1)
 string& insert (size_t pos, const string& str);
substring (2)
 string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
c-string (3)
 string& insert (size_t pos, const char* s);
buffer (4)
 string& insert (size_t pos, const char* s, size_t n);
fill (5)
 string& insert (size_t pos, size_t n, char c);
    void insert (iterator p, size_t n, char c);
single character (6)
iterator insert (iterator p, char c);
range (7)
template <class InputIterator>
   void insert (iterator p, InputIterator first, InputIterator last);

6.erase

sequence (1)
 string& erase (size_t pos = 0, size_t len = npos);
character (2)
iterator erase (iterator p);
range (3)
     iterator erase (iterator first, iterator last);

7.replace

string (1)
string& replace (size_t pos,  size_t len,  const string& str);
string& replace (iterator i1, iterator i2, const string& str);
substring (2)
string& replace (size_t pos,  size_t len,  const string& str,
                 size_t subpos, size_t sublen);
c-string (3)
string& replace (size_t pos,  size_t len,  const char* s);
string& replace (iterator i1, iterator i2, const char* s);
buffer (4)
string& replace (size_t pos,  size_t len,  const char* s, size_t n);
string& replace (iterator i1, iterator i2, const char* s, size_t n);
fill (5)
string& replace (size_t pos,  size_t len,  size_t n, char c);
string& replace (iterator i1, iterator i2, size_t n, char c);
range (6)
template <class InputIterator>
  string& replace (iterator i1, iterator i2,
                   InputIterator first, InputIterator last);
void test5()
{
	string s1("hello hello hello hello hello");
	size_t pos = s1.find(' ');
	while (pos != string::npos)
	{
		s1.replace(pos, 1, "%20");
		pos = s1.find(' ');
	}
	cout << s1 << endl;
}

另一种玩法:

void test6() 
{
	string s3;
	string s2("hello hello hello hello hello");
	s3.reserve(s2.size());
	for (auto ch : s2)
	{
		if (ch != ' ')
		{
			s3 += ch;
		}
		else
		{
			s3 += "%20";
		}
	}
	cout << s3 << endl;
	s2.swap(s3);
}

8.pop_back(c++11)

6.String operations

重点find

string (1)
size_t find (const string& str, size_t pos = 0) const;
c-string (2)
size_t find (const char* s, size_t pos = 0) const;
buffer (3)
size_t find (const char* s, size_t pos, size_t n) const;
character (4)
size_t find (char c, size_t pos = 0) const;

反着找

 

void teststring14()
{
	string protocol, domain, uri;
	string s1("https://legacy.cplusplus.com/reference/string/string/find/");
	size_t pos = s1.find(':');
	cout << pos << endl;

	if (pos != string::npos);
	{
		protocol = s1.substr(0, (pos - 0));  //协议
		cout << protocol << endl;
	}

	size_t pos1 = s1.find('/',pos+3);
	if (pos1 != string::npos);
	{
		domain = s1.substr(pos + 3, pos1-(pos + 3));  
		cout << domain << endl;

		uri = s1.substr(pos1 + 1);
		cout << uri << endl;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1643259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从电商系统认识数据与数据的存储

相信各位读者一年不知道要多少次通过电商App浏览和购买商品。既然大家对电商系统都比较熟悉&#xff0c;我将以电商系统作为研究对象&#xff0c;进一步聊聊数据与数据存储的相关内容。 比如我们在某平台搜索“文件系统”这个关键字&#xff0c;想看看这方面的书籍。当我们输入…

环形链表面试题详解

A. 环形链表1 给你一个链表的头节点 head &#xff0c;判断链表中是否有环. 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…

Typescript语法二

继承 继承是⾯向对象编程中的重要机制&#xff0c;允许⼀个类&#xff08;⼦类或派⽣类&#xff09;继承另⼀个类&#xff08;⽗类或基类&#xff09;的属性和⽅法。⼦类可以直接使⽤⽗类的特性&#xff0c;并根据需要添加新的特性或覆盖现有的特性。这种机制赋予⾯向对象程序良…

OpenCV的周期性噪声去除滤波器(70)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV如何通过梯度结构张量进行各向异性图像分割(69) 下一篇 :OpenCV如何为我们的应用程序添加跟踪栏(71) 目录 目标 理论 如何消除傅里叶域中的周期性噪声&#xff1f; 源代码 解释 结果 目…

C语言——指针的奥秘(1.0)

指针 一.内存和地址1.内存2.编址 二.指针变量和指针1.取地址操作符&#xff08;&&#xff09;2.指针变量和解引用操作符&#xff08;*&#xff09;1.指针变量2.拆解指针类型3.解引用操作符4.指针变量的大小 三.指针变量的类型和意义1.指针的解引用2.指针 - 整数3.void* 指针…

54.HarmonyOS鸿蒙系统 App(ArkTS)tcp socket套接字网络连接收发测试

工程代码https://download.csdn.net/download/txwtech/89258409?spm1001.2014.3001.5501 54.HarmonyOS鸿蒙系统 App(ArkTS)tcp socket套接字网络连接收发测试 import socket from ohos.net.socket; import process from ohos.process; import wifiManager from ohos.wifiMana…

redis的哨兵

文章目录 一、概念手动恢复redis主从复制的流程自动回复redis主从复制的流程 二、部署三、哨兵节点的作用演示四、哨兵节点的原理 一、概念 Redis Sentinel 相关名词解释 我主要说一个场景&#xff0c;就是我们上一篇讲到的redis主从复制会遇到的问题&#xff0c;朱姐带你如…

细粒度图像分类论文研读

细粒度图像分类论文研读 摘要Abstract1. 基于细粒度图像分类的视觉语义嵌入模型1.1 文献摘要1.2 创新点1.3 模型网络结构和方法1.3.1 问题陈述1.3.2 两级卷积神经网络1.3.3 局部化 CNN1.3.4 回归排序网络1.3.5 参数学习 1.4 实验1.4.1 数据集1.4.2 实验设置1.4.3 分类结果对比1…

3.SpringSecurity基本原理

SpringSecurity本质是一个过滤器链。十多个过滤器构成一个过滤器链。 这些过滤器在项目启动就会进行加载。每个过滤器执行放行操作才会执行下一个过滤器。 常见过滤器 FilterSecurityInterceptor 是一个方法级的权限过滤器&#xff0c;基本位于过滤器链的最底部。 Excepti…

图神经网络综述和学习路径

应用邻域 应用举例 应用层面&#xff08;节点&#xff0c;连接&#xff0c;子图&#xff0c;全图&#xff09; 概念区别 图神经网络本质上解决了表示学习的问题 可以把神经网络看作一个黑箱&#xff0c;图中的f函数 困难与挑战 现代的深度学习&#xff0c;如何把图输入到神经…

Qwik 和 Next.js 未来Web项目框架

Qwikover Next.js Qwik 是我进行 Web 项目开发的首选框架&#xff0c;而不是 Next.js 作为一名全栈工程师&#xff0c;我的前端之旅始于大约 10年前。从纯 JavaScript 和 jQuery 开始&#xff0c;然后转向了 KnockoutJS、AngularJS 和 GWT。React 出现&#xff0c; React 一直是…

IoTDB 入门教程 问题篇②——RPC远程连接IoTDB服务器失败

文章目录 一、前文二、发现问题三、分析问题四、检查6667端口是否监听所有IP五、检查ECS云服务器的安全组是否允许六、检查Linux防火墙是否允许 一、前文 IoTDB入门教程——导读 二、发现问题 使用本地IP127.0.0.1可以连接IoTDB服务器使用远程IPxx.xx.xx.xx却连接不到。提示你…

哥白尼高程Copernicus DEM下载(CSDN_20240505)

哥白尼数字高程模型(Copernicus DEM, COP-DEM)由欧洲航天局(European Space Agency, 简称ESA或欧空局)发布&#xff0c;全球范围免费提供30米和90米分辨率DEM。COP-DEM是数字表面模型(DSM)&#xff0c;它表示地球表面(包括建筑物、基础设施和植被)的高程。COP-DEM是经过编辑的D…

java发送请求-http和https

http和https区别 1、http是网络传输超文本协议&#xff0c;client---- http------ server 2、httpshttpssl证书&#xff0c;让网络传输更安全 &#xff0c;client---- httpssl------ server 3、ssl证书是需要客户端认可的&#xff0c;注意官方证书和jdk生成的证书的用户来使…

sql 中having和where区别

where 是用于筛选表中满足条件的行&#xff0c;不可以和聚类函数一起使用 having 是用于筛选满足条件的组 &#xff0c;可与聚合函数一起使用 所以having语句中不能使用select中定义的名字

【设计模式】13、template 模板模式

文章目录 十三、template 模板模式13.1 ppl13.1.1 目录层级13.1.2 ppl_test.go13.1.3 ppl.go13.1.4 llm_ppl.go13.1.5 ocr_ppl.go 十三、template 模板模式 https://refactoringguru.cn/design-patterns/template-method 如果是一套标准流程, 但有多种实现, 可以用 template …

nodejs的ws+vue3编写聊天室的demo

nodejs编写ws服务是非常简单高效的&#xff0c;nodejs有众多的实现ws的库&#xff0c;如ws,SocketIO等&#xff0c;nodejs的事件线程是单线程的&#xff0c;所以不要在事件线程内做阻塞性的操作&#xff0c;耗时的操作交给工作线程或者子进程操作。 我使用nodejsvue3实现了写了…

安装vscode基础配置,es6基础语法,

https://code.visualstudio.com/ es6 定义变量 const声明常量&#xff08;只读变量&#xff09; // 1、声明之后不允许改变 const PI “3.1415926” PI 3 // TypeError: Assignment to constant variable. // 2、一但声明必须初始化&#xff0c;否则会报错 const MY_AGE /…

MySQL —— 表的基本操作

一、创建 1.语法 create table 表名称( 自定义变量1, 自定义变量2, 自定义变量3&#xff08;最后一个变量末尾不需要加任何标点符号&#xff09; )charset字符集 collate校验集 engine存储引擎; ps&#xff1a;若是不具体给字符集、校验集、储存引擎&#xff0c;则采用配置文件…

【网络安全产品】---应用防火墙(WAF)

what Web应用防火墙&#xff08;Web Application Firewall) WAF可对网站或者App的业务流量进行恶意特征识别及防护&#xff0c;在对流量清洗和过滤后&#xff0c;将正常、安全的流量返回给服务器&#xff0c;避免网站服务器被恶意入侵导致性能异常等问题&#xff0c;从而保障…