波奇学STL:String入门和迭代器

news/2024/10/30 8:27:30/

目录

​编辑

Constructor/Destructor/Operator=

Constructor:构造函数

Iterator:迭代器

begin()/end():迭代器像指针一样访问问函数

个人对迭代器的理解

rbegin()/rend():迭代器反向移动

除了用迭代器访问元素外string类还可以[]+下标

Capacity:容量?

s.size()/s.length:求字符串

s.reserve()非强制指令修改容量大小

s.resize(n,ch)修改字符串内容到n个长度,用ch字符填补新增的长度

Element access:获取元素

Modifiers:修改

 +=:添加字符或字符串到原来的字符

assign是覆盖字符串和replace大同小异

insert:选择地方插入字符串

erase:消除指定位置字符串

 String operations

find寻找字符串的对于字符或者字符串返回第一个位置,如果没找到返回npos常数

rfind:从后往前找,和find的方向相反。

find_first_of:找出字符串的所有指定字符

Member constans:常数

Non-member function overloads:非成员函数

getline:读取有空格的字符串

 

Constructor/Destructor/Operator=

Constructor:构造函数

#include<iostream>
#include<string>
using namespace std;
int main()
{string s1;//空字符串string s4("abcde");//"abcde"string s5("abcde",3);//"abc" 截取前n个string s2(s1);//空字符串 //拷贝构造string s3(s4, 0, 2);//'ab' //截取s4的[0,2),不包括2string s6(6, 'a');//'aaaaaa'return 0;
}

Iterator:迭代器

begin()/end():迭代器像指针一样访问问函数

string::iterator it = s1.begin();while (it != s1.end()){cout << *it <<" ";++it;}

有点懵对吗?先看看第一句代码

string::iterator it=s1.begin();
//定义了变量it,调用s1的实例方法begin的返回值赋值给it
//it的类型是 string::iterator表明it的类型是string的迭代器

所有s1.begin()和s1.end()表示什么意思?

图解 

s1.begin()可以看成第一个元素的地址,s1.end()可以看成最后一个有效元素('o')的下个元素的地址('/0');

由此我们明白了代码的意思,从第一个的元素开始访问,一直到'/0'停止。

观察代码我们发现迭代器的用法和地址很像,上面也说了可以看成指针,所有迭代器是指针吗?

迭代器不完全是指针

某些类的迭代器底层是指针,如string,但是有些类的迭代器底层并不是指针,但在理解上可以看成指针。

个人对迭代器的理解

在C时我们用数据类型(int ,char等)去描述一个对象,但是这是一种机器的角度去看待事物,随着发展,人们提出用类和对象去描述一个对象,如果类对标的是数据类型,那么迭代器对标的就是指针,所以迭代器是类指针(如果真的有这个名字,笑),准确说是stl的类

rbegin()/rend():迭代器反向移动

	string s1("hello world");string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *rit << " ";++rit;}
dlorw olleh

图解

除了用迭代器访问元素外string类还可以[]+下标

string s1="hello";
s1[0]//'h'
s1[1]//'e'
s1[2]//'l'

两种方式的比较

两种访问方式的比较

[]+下标比较简洁,但是只能在链状结构上使用,比如数组,string(如果是树的话,就不能用这种方式了。)

迭代器可以用于所有的容器(就是数据结构,如树,图等等),迭代器可以和算法配合。

Capacity:容量?

有点懵?我们可以把类的成员变量简化为右边三个 

 _s 表示字符串, _size表示字符串大小, _capacity表示空间的容量,如果字符串大于空间大小就系统就会扩容。

s.size()/s.length:求字符串

string s("hello world");
//s.size()/s.length()返回字符串长度不包括'\0'
s.size() //11
s.length() //11
s.max_size()//字符串的最大长度
s.capacity()//字符串开辟的空间
s.clear()//清空字符串内容

s.max_size()并没有太大意义,不同版本的编译下值不同,不同编译器的s.capacity()变化方式也不同

s.reserve()非强制指令修改容量大小

s.resever(100)//capacity:15->100 or greater

不一定等于100是因为编译器的对齐原则可能大于100

非强制体现在字符串非空时不会缩小空间,clear()后就会

s.reserve(1)//capacity:15->15,非空字符串s.clear()
s.reserve(1)//capacity:15->1

s.resize(n,ch)修改字符串内容到n个长度,用ch字符填补新增的长度

string s("hello world");
s.resize(s.size()+1,'!');// hello word!

*n是长度,不是空间,不算'/0',如果n小于s.size()就会只取前n个字符。

s.shrink_to_fit()是收缩空间。

Element access:获取元素

operator[]上文已经提到了,s.at()用法和operator[]一样

s.at(0)//h
s[0]//h
s.back();// d
s.front();// h

*s.back()是字符串的长度的最后一个,不算'\0'

Modifiers:修改

 +=:添加字符或字符串到原来的字符

string s("hello world");
s+='!';//"hello world!"

+=和append,push_back大同小异,append稍微特殊的用法可以截取一段字符的一部分添加

string s1("bye");
s.append(s1,0,1);//"hello worldb"

注意截取的片段是[0,1)的关系。

assign是覆盖字符串和replace大同小异

string s("hello world");
string s1("bye");
s.assign(s1, 0, 1);//s:b

insert:选择地方插入字符串

string s("hello world");
string s1("bye");
s.insert(0,s1);
cout << s << endl;//byehello world

在0的位置的插入字符串

erase:消除指定位置字符串

string s("hello world")
s.erase(0,1);
cout << s << endl;//ello world

 String operations

find寻找字符串的对于字符或者字符串返回第一个位置,如果没找到返回npos常数

string s("hello world");
cout << s.find('h') << endl;
// 0

rfind:从后往前找,和find的方向相反。

find_first_of:找出字符串的所有指定字符

string s("hello world");
cout << s.find_first_of("helo") << endl;
//0 第一个字符h就在"helo"

寻找在字符串"helo"的任何一个字符,并返回位置

find_last_of:从后向前找

Member constans:常数

string s("hello world");
size_t a = -1;
s.npos == a //true

s.npos表示size_t的最大值,常常会出现在返回值或者参数时,如find没找到字符串会返回npos和a的值是相同的。

Non-member function overloads:非成员函数

 operator+/operator>>/operator<<在前面的章节函数重载时提过,因为顺序的原因所以一个是不能重载的。

getline:读取有空格的字符串

string s;
string s1;
cin>>s1;//"h d"
getline(cin, s);//"h d"
cout << s;//"h d"
cout << s1;//'h'

cin不能读取空格,getline可以

最后:学STL还是要学看官方文档,此文只是为有个大体的印象。


http://www.ppmy.cn/news/107938.html

相关文章

【Linux】linux进程间通信netlink socket(用户与内核通信) 二

目录 1.netlink socket介绍 2.netlink socket特点 3.为什么引入generic netlink 4.netlink通信架构 5.相关结构体 5.1 genl family

Spring之状态机讲解

文章目录 1 状态机1.1 什么是状态1.2 四大概念1.3 状态机1.4 spring statemachine 2 示例Demo2.1 订单状态图2.2 建表2.3 依赖和配置2.3.1 pom.xml2.3.2 application.yml 2.4 状态机配置2.4.1 定义状态机状态和事件2.4.2 定义状态机规则2.4.3 配置持久化2.4.3.1 持久化到内存2.…

day6 | 242.有效的字母异位词、 349. 两个数组的交集、202. 快乐数、 1. 两数之和

目录&#xff1a; 链接 题目链接&#xff1a; https://leetcode.cn/problems/valid-anagram/ https://leetcode.cn/problems/intersection-of-two-arrays/ 哈希表基础 参考&#xff1a;https://programmercarl.com/哈希表理论基础.html 哈希表是根据关键码的值而直接进行…

Mysql第二章 多表查询的操作

这里写自定义目录标题 一 外连接与内连接的概念sql99语法实现 默认是内连接sql99语法实现左外连接&#xff0c;把没有部门的员工也查出来sql99语法实现右外连接&#xff0c;把没有人的部门查出来sql99语法实现满外连接&#xff0c;mysql不支持这样写mysql中如果要实现满外连接的…

以太坊Layer 2即将爆发!加密巨头入场布局,或将迎来“百链大战”!

眼下&#xff0c;以太坊Layer 2发展势头强劲。在数十条Rollup Layer 2异彩纷呈之际&#xff0c;Coinbase、ConsenSys等加密巨头也开始下场参与竞争&#xff0c;部署原生Layer 2网络。 截至2022年底&#xff0c;Layer 2解决方案的日均交易数在持续增加&#xff0c;甚至超过了以太…

在线帮助中心搭建利器:Baklib

帮助中心是一个提供服务和支持的虚拟平台&#xff0c;旨在为客户提供解决问题和获取信息的途径。它通常包含企业或组织的产品或服务的相关信息、解决方案、操作指南和常见问题等信息。通过帮助中心&#xff0c;用户可以自助查询并解决问题&#xff0c;从而提高了客户的满意度和…

Pulsar 负载均衡与transaction_coordinator_assign

背景与现状 TC加载到哪个broker上取决于transaction_coordinator_assign-partition-${TC ID}分区加载到哪个broker上。 默认transaction_coordinator_assign有16个分区&#xff0c;因此默认有16个TC&#xff0c;我们需要根据集群机器/broker数目来设置合理的TC个数。 为了保证…

PMBOK中的20个常用英文缩写及其含义

在项目管理的世界中&#xff0c;有许多常用的英文缩写。这些缩写代表了PMBOK&#xff08;项目管理知识体系&#xff09;中的重要概念和工具。对于初学者来说&#xff0c;熟悉这些缩写及其含义对于理解和运用项目管理的基本原则非常重要。 PMBOK: Project Management Body of Kn…