vector

server/2024/12/23 5:11:32/

vector

在这里插入图片描述

string的流提取

代码如下:

istream& operator>>(istream& is, string& str)
{str.clear();int i = 0;char buff[256];char ch;//is >> ch;ch = is.get();while (ch != ' ' && ch != '\n'){//str += ch;buff[i++] = ch;if (i == 255)//255个字符{buff[255] = '\0';//最后一个留给'\0'str += buff;i = 0;//置为零重新提取}ch = is.get();}if (i > 0)//不满255{buff[i] = '\0';str += buff;}return is;
}

这里引入buff,在栈区开辟空间

有两个好处:

1.栈上开辟空间,比堆效率高

2.即用即销毁

总的来说,对于大的方面来说,减少扩容,不会浪费空间

用getline的情况:

string.h

istream& getline(istream& is, string& str, char delim = '\n');
//delim是分隔符

string.cpp

istream& getline(istream& is, string& str, char delim){str.clear();int i = 0;char buff[256];char ch;ch = is.get();while (ch != delim){// 放到buffbuff[i++] = ch;if (i == 255){buff[i] = '\0';str += buff;i = 0;}ch = is.get();}if (i > 0){buff[i] = '\0';str += buff;}return is;}

test.cpp

void test_string07()
{Tzuyu::string s1;getline(cin, s1);cout << s1 << endl;getline(cin, s1, '#');//遇到#停止输入cout << s1 << endl;
}

swap

库里面的swap

在这里插入图片描述

会进行深拷贝,深拷贝会重新拷贝一块空间,进行赋值,再析构销毁,但是这样的代价太大了

怎么样能使代价变小呢?

这个时候我们可以用string自己的成员函数swap

string自己的成员函数swap

在这里插入图片描述

现代写法

拷贝的现代写法

代码如下:

//现代写法
string::string(const string& s)
{string tmp(s._str);swap(tmp);
}

这种写法,有点类似于资本主义压榨剩余价值,让别人来干活,传统的写法就是老老实实地开辟空间进行深拷贝,现代写法的逻辑图如下:

在这里插入图片描述

这里的swap是string成员里面的swap

所有的值都必须要走初始化列表

为什么这里的tmp要指向空呢?

因为这里是局部对象,出了作用域要被操作系统给回收的,索性直接置空

赋值的现代方法

string& string::operator=(const string& s)
{if (this != &s){string tmp(s._str);swap(tmp);}return *this;
}

更加简便地写法:

string.h

string& operator=(string s);

string.cpp

string& string::operator=( string s)
{swap(s);return *this;
}

在这里插入图片描述

这里是让s和s1交换空间,因为在栈区,所以会被操作系统回收空间

这里并没有效率的提升,本质是复用

引用计数+写时拷贝(了解)

写时拷贝就是一种拖延症,是在浅拷贝的基础之上增加了引用计数的方式来实现的。

引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成1,每增加一个对象使用该 资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源, 如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;否则就不能释放,因为还有 其他对象在使用该资源。

在这里插入图片描述

vector

实现代码:

#include<vector>int main()
{vector<int> v1;vector<int> v2(10, 1);v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);// 遍历for (size_t i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;vector<int>::iterator it1 = v1.begin();while (it1 != v1.end()){cout << *it1 << " ";++it1;}cout << endl;for (auto e : v1){cout << e << " ";}cout << endl;vector<string> vstr;//不带'\0'string s1 = "张三";//带'\0'vstr.push_back(s1);vstr.push_back("李四");for (const auto& e : vstr){cout << e << " ";}cout << endl;vstr[0] += 'x';vstr[0] += "apple";//vstr[0][0]++;vstr[0][1]++;vstr[0][1]++;vstr.operator[](0).operator[](1)++;//看上去像二维数组,实际上调用了两个容器,先是vector后是stringfor (const auto& e : vstr){cout << e << " ";}cout << endl;

http://www.ppmy.cn/server/125095.html

相关文章

Vue3 中 this 一分钟了解

Vue3 中 this 在Vue3的开发过程中&#xff0c;this的使用方式和Vue2有着显著的不同&#xff0c;特别是在组合式API&#xff08;Composition API&#xff09;的引入后。本文将深入探讨Vue3中this的使用&#xff0c;解析其底层源码&#xff0c;并探讨这种设计背后的原因&#xff…

哪家宠物空气净化器可以高效去除浮毛?希喂、IAM、有哈怎么样

在现代养宠家庭中&#xff0c;随着生活节奏的加快&#xff0c;清理浮毛也是很多家庭周末必须要做的事情。但是如何选择一款吸毛好、还不增加清理负担的宠物空气净化器&#xff0c;在寸土寸金的租房里为全家老小的健康生活保障&#xff1f;又如何通过强大的吸毛、除臭技术和除菌…

Python 入门教程(5)流程控制 | 5.2、for 语句

文章目录 一、for 语句1、基本语法2、遍历3、嵌套循环4、跳出循环 前言&#xff1a; 在编程的世界里&#xff0c;循环是一种基本的控制结构&#xff0c;它允许我们重复执行某段代码&#xff0c;直到满足某个条件为止。Python提供了多种循环机制&#xff0c;其中for语句是最常用…

Git忽略规则原理和.gitignore文件不生效的原因和解决办法

在使用Git进行版本控制时&#xff0c;.gitignore文件扮演着至关重要的角色。它允许我们指定哪些文件或目录应该被Git忽略&#xff0c;从而避免将不必要的文件&#xff08;如日志文件、编译产物等&#xff09;纳入版本控制中。然而&#xff0c;在实际使用过程中&#xff0c;有时…

STM32三种启动模式:【详细讲解】

STM32在上电后&#xff0c;从那里启动是由BOOT0和BOOT1引脚的电平决定的&#xff0c;如下表&#xff1a; BOOT模式选引脚启动模式BOOT0BOOT1X0主Flash启动01系统存储器启动11内置SRAM启动 BOOT 引脚的值在重置后 SYSCLK 的第四个上升沿时被锁定。在重置后,由用户决定是如何设…

Flux【真人模型】:高p高糊反向真实质感!网图风格的Lora模型,超逼真的AI美女大模型!

大家好&#xff0c;我是画画的小强 今天和大家分享一款基于Flux训练的网图风格的lora模型&#xff1a;墨幽-F.1-Lora-网图&#xff0c;该Lora模型由墨幽团队出品&#xff0c;旨在生成高p高糊的反向真实质感图片&#xff0c;而非真实摄影图片。不过&#xff0c;在自己出图过程中…

Vue 之组件插槽Slot用法(组件间通信一种方式)

1)插槽由来和分类 在某些场景中&#xff0c;我们可能想要在父组件为子组件传递一些模板片段&#xff0c;让子组件在它们的组件中渲染这些片段。 这就是插槽的作用。插槽分多种&#xff0c;默认插槽、具名插槽、条件插槽、动态插槽、作用域插槽。 2&#xff09;插槽类型和举栗…

数学建模研赛总结

目录 前言进度问题四分析问题五分析数模论文经验分享总结 前言 本文为博主数学建模比赛第五天的内容记录&#xff0c;希望所写的一些内容能够对大家有所帮助&#xff0c;不足之处欢迎大家批评指正&#x1f91d;&#x1f91d;&#x1f91d; 进度 今天已经是最后一天了&#xf…