vector

embedded/2024/12/30 1:16:51/

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/embedded/120188.html

相关文章

MySQL踩坑点:字符集和排序规则

一、utf8 和utf8mb4 1、utf8 不支持生僻字和表情包等 2、utfmb4 支持生僻字和表情包等 在国内&#xff0c;使用最多就是这两个字符集。 二、mysql的默认排序规则 1、字符集utf8的默认排序规则&#xff1a; uft8_general_ci, 不区分大小写uft8_bin, 区分大小写 2、字符…

C++游戏开发:构建高性能、沉浸式游戏体验的关键

引言 C作为游戏开发的核心语言&#xff0c;凭借其卓越的性能和灵活性&#xff0c;已成为许多现代游戏引擎和开发项目的首选。在游戏开发中&#xff0c;C不仅可以实现复杂的游戏逻辑&#xff0c;还能有效管理资源和优化性能。本文将深入探讨C在游戏开发中的应用&#xff0c;结合…

数据结构与算法——Java实现 25.双栈模拟队列

目录 232. 用栈实现队列 思路 代码实现 所有那些独处的时光&#xff0c;决定了我们称为什么样的人 —— 24.9.29 232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&am…

设计模式相关知识

核心思想 识别代码中稳定的部分和变化的部分&#xff0c;然后通过抽象、封装等手段&#xff0c;将变化隔离出去&#xff0c;从而达到整体的稳定六大原则 单一职责 开发封闭 里氏替换原则 接口隔离 依赖倒转 迪米特法则创建 工厂模式 问题 构造器表现力不足 无法干预创造过程 ne…

【C++ STL】深入理解string类的底层实现

string类的模拟实现 一.string的构造与析构函数1.普通构造函数与析构函数2.拷贝构造的浅拷贝所带来的问题3.如何实现深拷贝 二.运算符重载1.赋值运算符重载2.大小比较相关的运算符重载 三.迭代器的实现四.string常用操作的实现1.静态const成员npos的定义2.插入操作3.查找操作4.…

大模型智能体在金融公告理解领域的应用 | OPENAIGC开发者大赛高校组AI创新之星奖

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…

基于php的幸运舞蹈课程工作室管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

[Uninstall] 软件彻底卸载工具的下载及详细安装使用过程(附有下载文件)

一般软件安装的有问题&#xff0c;或者想重新安装其他版本就需要将原来的版本删除干净&#xff0c;但常常删不干净&#xff0c;本文分享一个软件彻底卸载工具&#xff0c;完成彻底卸载软件的工作 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文…