初始C++中的string与迭代

常用的string构造相关类的接口

string类是一个管理字符串的字符数组,string类的出现方便管理我们日常所遇见的,字符名,字符串等等。下面们介绍一下常见的string类接口。

string();

默认构造,构造空的string类

int main()
{
    string s1;
    cout << s1 << endl;
    return 0;
}

string (const string& str);

拷贝构造,构造一个和已存在的string对象一模一样的对象。

int main()
{
    string s1("abcd");
    cout << s1 << endl;
    return 0;
}

 string (const string& str, size_t pos, size_t len = npos);

从字符串的pos位置拷贝n个字符到字符串str上,pos是所拷贝的位置len是所拷贝的长度。这里涉及到一个特殊的玩法,拷贝的长度如果大于字符串剩余的,这种情况并不会报错,会拷贝所以剩下的所有。还有一种情况,传入时若长度并未传入,也是会直接拷贝到字符串'\0'的位置

int main()
{
    string s1("abcd",1,5);
    cout << s1 << endl;
    return 0;
}

string (const char* s);

用字符串来构造类对象

int main()
{
    char s1[] = "abcdfg";
    string s2(s1);
    cout << s2 << endl;
    return 0;
}

string (const char* s, size_t n);

s所指向字符串(或字符数组)的前n个来初始化创建一个string类对象。

int main()
{
    char s1[] = "abcdfg";
    string s2(s1,3);
    cout << s2 << endl;
    return 0;
}

string (size_t n, char c);

n个字符进行初始化

int main()
{
    string s1(5,'a');
    cout << s1 << endl;
    return 0;
}

 

常用的string遍历相关类的接口

1.[]+下标

[ ]+下标本质是调用函数string::operator[],operator[]的返回值是一个引用,所以可以通过[]加下标的方式去访问和修改string类对象。string::operator[]即可以针对普通对象也可针对const对象。 [ ]+下标的方法适用于底层是连续的字符串这种情况。

补充[ ]与at的区别:在越界时[]会触发底层的断言,而at要通过捕获后显示。

int main()
{
    //遍历方式
    string s1("hello");
    for (size_t i=0; i < s1.size(); i++)
    {
        s1[i]++;
        cout << s1[i] << " ";
    }
    cout << endl;

    return 0;
}

2.迭代器

迭代器可以理解一种指针的东西,它本身并不一定是指针,是不是指针取决与底层。

string::iterator 变量名 = s1.begin();

int main()
{//迭代器的用法string s1("hello");string::iterator s = s1.begin();//起始位置while (s!=s1.end())//字符串最后一个字符的下一个位置{cout << *s << " ";cout << ++(*s) << " ";//字符串++的情况s++;}cout << endl;return 0;
}

上述案例中是否可以把s!=s1.end()改为s<s1.end

这里我们要明白是迭代器的底层并不是指针,在数组中这中情况是可以的,因为数组是空间是连续的,但是在链表中就不可以了。下面使用list进行验证一下底层到底是不是指针,这里我们通过对比可以看出,底层不是指针,如果是指针解引用不就是节点了吗?

“语法糖”

auto

auto的用法是可以自动识别右侧的类型,简化代码,代替写起来长的类型。

int i=10;

auto a=1;//int

auto b=1.0;//double

auto &c=i;//int &

auto f=c//int

auto &d=c;//int &

auto e=&i;//int *

范围for

//自动进行遍历,自动取出容器的值给左边的值

//自动++,自动判读结束

//适用于容器和数组,范围for底层是迭代器

for(auto 变量名:容器名);

 如何实现修改

遍历for是自动取出容器的值给左边的对象,拷贝的值进行自增并不会影响容器的值,所以这里采用引用。

添加引用的两种情况

  1. 拷贝的数的较大时这种情况拷贝太难处理
  2. 要进行修改

 反向迭代器

reverse_iterator rbegin();

int main()
{string s("abcde");std::string::reverse_iterator rit = s.rbegin();//auto rit=s.rbegin();while (rit != s.rend()){cout << *rit << " ";rit++;//注意这里是++而不是--}cout << endl;return 0;
}

 rebegin()底层实现的图像解析,这里只是逻辑这样实现的,底层不一定是这样实现的。

const_ reverse_iterator rbegin();

const_ reverse_iterator rbegin();与reverse_iterator rbegin();功能一样,前者实现的不能进行修改。

插入用法

插入单个字符

s.push_back('x');

插入字符串

 operator+=insert插入

 上述的几种对数组的插入都是尾插,insert可以对不同位置进行插入。

int main()
{string s1("abcde");string s2("efg");//在指定位置插入字符串s1.insert(1, s2);cout << s1 << endl;//在指定位置插入指定长度,指定位置一段字符串s1.insert(1, s2, 1, 2);cout << s1 << endl;//指定位置插入一段字符串s1.insert(1, "xxx");cout << s1 << endl;//指定位置插入长度为n的一段字符串s1.insert(1, "xxx", 1);cout << s1 << endl;//指定位置插入n个字符s1.insert(s1.begin(), 3, '1');cout << s1 << endl;return 0;
}

实战演练

1.用C++实现仅仅反转字母

 字符串相加
 代码优化:

 通过insert进行的插入是头插入,头插对于字符的处理时后面的字符要向后移动,因此头插入的时间复杂度在本题是0(n^{2}),但是通过尾插是0(n),虽然尾插不是我们预期的,但是可以调用reverse模板进行反转。

 总结

以上就是本期的主要内容主要介绍了string常用的基础用法,以及迭代的实现介绍。由于string具有较多的接口,这里不进行一一介绍,可以通过此处传送门进入Cplusplus官网进行查阅。最后期待各位大佬的一键三连(点赞,收藏,关注)。

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

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

相关文章

深度学习电脑独显GPU占用一直0%解决方式

在系统设置里面把硬件加速GPU计划关了 然后重启 再随便跑个模型 打开任务管理器可以看到独显开始工作了 再在GPU1中将3D改成Cuda即可

Vue项目之Element-UI(Breadcrumb)动态面包屑效果 el-breadcrumb

效果预览 需要导航的页面Vue.js 最笨的方法就是在每个需要面包屑的页面中固定写好 <template><div class="example-container"><el-breadcrumb separator="/"

【Linux-基础IO】C语言文件接口回顾 系统文件概念及接口

目录 一、C语言文件接口回顾 C语言基础知识 C中文件操作示例 二、系统文件概念及接口 重定向基本理解的回顾 文件的基本概念 系统调用接口 open read write close lseek 什么是当前路径 一、C语言文件接口回顾 引言&#xff1a;我们并不理解文件&#xff01;从语…

springboot实战学习(7)(JWT令牌的组成、JWT令牌的使用与验证)

接着上篇博客的学习。上篇博客是在基本完成用户模块的注册接口的开发以及注册时的参数合法性校验的基础上&#xff0c;基本完成用户模块的登录接口的主逻辑以及提到了问题&#xff1a;"用户未登录&#xff0c;需要通过登录&#xff0c;获取到令牌进行登录认证&#xff0c;…

TypeError: a bytes-like object is required, not ‘str‘ - 完美解决方法

&#x1f680;TypeError: a bytes-like object is required, not str - 完美解决方法&#x1f4a1; &#x1f680;TypeError: a bytes-like object is required, not str - 完美解决方法&#x1f4a1;摘要引言正文1. 错误背景&#xff1a;字节与字符串的区别&#x1f440;2. 错…

告别ESLint噩梦!轻松几步解决 indent 与 react/jsx-indent-props 的 空格 冲突!

话不多说&#xff0c;直接上代码&#xff0c;下面是截取的一部分 eslint 配置。可以看到我设置了四个空格和标签属性对齐首个。 "rules": {"indent": ["error", 4], // 四个空格"react/jsx-indent-props": ["error", "…

双虚拟机部署php项目

前言 经过前面的学习,我们对分布式部署有了一定的了解,这次我们尝试做些东西 准备 我打算用虚拟机部署一个外联网盘 一台虚拟机安装php另一台安装MySQL,但是之前已经安装过 MariaDB 了,就不打算改了。 通常MariaDB与MySQL兼容性很好,可以作为替代使用。彩虹外链网盘项目…

【C++11】异常处理

目录 一、异常的引入 二、C异常的关键字 三、异常的抛出与处理规则 四、异常缺陷的处理 五、自定义异常体系 六、异常规范 七、异常安全 八、异常的优缺点 1.优点 2.缺点 一、异常的引入 传统的C语言处理异常的方式有两种&#xff1a; 1.终止程序&#xff1a;使用as…

CSS 选择器的分类与使用要点一

目录 非 VIP 用户可前往公众号进行免费阅读 标签选择器 id 选择器 类选择器 介绍 公共类 CSS 中优先用 class 选择器,慎用 id 选择器 后代选择器 交集选择器 以标签名作为开头 以类名作为开头 连续交集 并集选择器(分组选择器) 通配符* 儿子选择器 >(IE7…

变量常量标识符

1. 变量 1.1 变量的概念 变量是计算机内存中的一块存储单元&#xff0c;是存储数据的基本单元变量的组成包括&#xff1a;数据类型、变量名、值&#xff0c;后文会具体描述变量的本质作用就是去记录数据的&#xff0c;比如说记录一个人的身高、体重、年龄&#xff0c;就需要去…

PP-HGNet(High Performance GPU Net)

发展历程&#xff1a; DenseNet -> VoVNet -> HGNet VoVNet是DenseNet的改进&#xff0c;如图&#xff1a; VoVNet论文网址&#xff1a; https://arxiv.org/pdf/1904.09730 HGNet模型简介 PP-HGNet(High Performance GPU Net) 是百度飞桨视觉团队自研的更适用于 GPU…

【AI大模型】对接LLM API

本章节主要介绍四种大语言模型&#xff08;ChatGPTAPI、文心一言、讯飞星火、智谱 GLM&#xff09;的 API 申请指引和 Python 版本的原生 API 调用方法。 文心一言&#xff1a;当前无赠送新用户 tokens 的活动&#xff0c;推荐已有文心 tokens 额度用户和付费用户使用&#xf…

果断收藏!2024年最好用的七款高效论文写作神器

在2024年&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI论文写作工具成为学术研究和写作领域的一大助力。这些工具不仅能够显著提高写作效率&#xff0c;还能帮助学者和学生节省时间&#xff0c;减少熬夜&#xff0c;同时保证论文质量。以下是七款高效且值得收藏的AI论…

Python_控制循环语句

if语句单分支结构的语法形式如下&#xff1a; 【操作】输入一个数字&#xff0c;小于10&#xff0c;则打印这个数字(if_test01.py)&#xff1a; num input("输入一个数字&#xff1a;") if int(num)<10: print("小于10的数&#xff1a;"num)条件表达式…

2024年华为杯数学建模E题-高速公路应急车道启用建模-基于YOLO8的数据处理代码参考(无偿分享)

利用YOLO模型进行高速公路交通流量分析 识别效果&#xff1a; 免责声明 本文所提供的信息和内容仅供参考。尽管我尽力确保所提供信息的准确性和可靠性&#xff0c;但我们不对其完整性、准确性或及时性作出任何保证。使用本文信息所造成的任何直接或间接损失&#xff0c;本人…

资源创建方式-Job

Job: 容器按照持续运行的时间可分为两类&#xff0c;服务类容器&#xff0c;和工作类容器 服务类容器通常持续提供服务&#xff0c;需要一直运行&#xff0c;比如HTTP,Server&#xff0c;Daemon等&#xff0c; 工作类容器则是一次性任务&#xff0c;比如批处理程序&#xff0…

stm32单片机个人学习笔记7(TIM定时中断)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

数值计算 --- 平方根倒数快速算法(中)

平方根倒数快速算法 --- 向Greg Walsh致敬&#xff01; 1&#xff0c;平方根倒数快速算法是如何选择初值的?WTF中的神秘数字究竟是怎么来的&#xff1f; 花开两朵&#xff0c;各表一枝。在前面的介绍中&#xff0c;我们已经知道了这段代码的作者在函数的最后使用了NR-iteratio…

Python办公自动化教程(003):PDF的加密

【1】代码 from PyPDF2 import PdfReader, PdfWriter# 读取PDF文件 pdf_reader PdfReader(./file/Python教程_1.pdf) pdf_writer PdfWriter()# 对第1页进行加密 page pdf_reader.pages[0]pdf_writer.add_page(page) # 设置密码 pdf_writer.encrypt(3535)with open(./file/P…

mybatis 配置文件完成增删改查(四) :多条件 动态sql查询

文章目录 就是你在接收数据时&#xff0c;有的查询条件不写&#xff0c;也能从查到相应的stauts也可能为空恒等式标签 代替where关键字 就是你在接收数据时&#xff0c;有的查询条件不写&#xff0c;也能从查到相应的 注意是写字段名 还是 属性名 companyName不写也能查出满足…