string和oj题以及vector的接口介绍

前言

上篇博客学习了一些string类的模拟实现erase、find、substr、比较大小、流输入、流输出,这篇博客将介绍剩下的一些string的知识以及vector的一些使用方式。

string

传统深拷贝的写法

//拷贝构造
string(const string& s)
{_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;
}//拷贝赋值
string& operator=(const string& s)
{if (this != &s){delete[] _str;_str = new char[s._capacity + 1];strcpy(_str,s._str);_size = s._size;_capacity = s._capacity;}return *this;
}

手动将字符串的空间进行调整

现代深拷贝的写法

void swap(string& s)
{std::swap(_str,s._str);std::swap(_size,s._size);std::swap(_capacity, s._capacity);
}
//拷贝构造
string(const string& s)
{string tmp(s._str);swap(tmp);
}
//拷贝赋值
string& operator=(const string& s)
{if (this != &s){string tmp(s);swap(tmp);}return *this;
}string& operator=(string s)
{swap(s);return *this;
}

在这里插入图片描述
利用swap将数据进行深拷贝
在这里插入图片描述
从中我们可以知道,string中的swap底层也是靠std中的swap实现的。

写时拷贝与引用计数

写时拷贝就是一种拖延症,是在浅拷贝的基础之上增加了引用计数的方式来实现的。
引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;否则就不能释放,因为还有其他对象在使用该资源。
在这里插入图片描述
我们知道深拷贝存在的问题:

  1. 需要析构两次
  2. 一个数据修改了会影响另一个数据

而写时拷贝可以让一个数据被删除时,另一个数据不会被影响
在这里插入图片描述

oj题

反转字符串中的单词 III

反转字符串中的单词 III-力扣
在这里插入图片描述
思路:

  1. 利用find找空格的位置
  2. 利用reverse将每个词进行反转
  3. 最后利用rfind找到最后一个空格的位置,将最后一个词进行反转
class Solution {
public:string reverseWords(string s) {int end=s.find(" ");int begin=0;while(end != -1){reverse(s.begin()+begin,s.begin()+end);begin=end+1;end=s.find(" ",begin);}end=s.rfind(" ");reverse(s.begin()+end+1,s.end());return s;}
};

在这里插入图片描述

字符串相乘

字符串相乘-力扣
在这里插入图片描述
思路:
在这里插入图片描述

  1. 将两个字符串进行反转
  2. 创建数组,遍历将乘积存入数组
  3. 接着进行进位
  4. 最后将数组中的数字倒着进行输出即可
class Solution {
public:string multiply(string num1, string num2) {if(num1 == "0" || num2 == "0")return "0";reverse(num1.begin(),num1.end());reverse(num2.begin(),num2.end());int s1=num1.size(),s2=num2.size();int* ans=new int[s1+s2]{0};for(int i=0;i<s1;i++){for(int j=0;j<s2;j++){ans[i+j] +=(num1[i]-'0')*(num2[j]-'0');}}for(int i=0;i<s1+s2;i++){if(ans[i]>9){int t=ans[i];ans[i]=t%10;ans[i+1]+=(t/10);}}int pos=(ans[s1+s2-1] == 0 ? s1+s2-2:s1+s2-1);string s;for(;pos>=0;--pos){s+=(ans[pos]+'0');}return s;}
};

在这里插入图片描述

vector

vector接口介绍

  • vector的构造函数

⁂ 代表重点

vector的构造函数说明
vector()⁂无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化n个val
vector((const vector& x)⁂拷贝构造
vector (InputIterator first, InputIterator last)使用迭代器进行构造
  • vector的输出方式

⁂ 代表重点

vector的输出方式说明
范围for从头到尾遍历
operator[] ⁂返回vector中n处的元素的引用
begin()+end() ⁂获取第一个数据位置的iterator 获取最后一个数据的下一个位置的iterator
rbegin()+rend()获取第一个数据位置的reverse_iterator, 获取最后一个数据的reverse_iterator
cbegin()+cend()获取第一个数据位置的const_iterator, 获取最后一个数据的下一个位置的const_iterator
crbegin()+crend()获取第一个数据位置的const_reverse_iterator, 获取最后一个数据的const_reverse_iterator
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v;vector<int> v2(10, 2);for (auto i : v2){cout << i << " ";}cout << endl;vector<int> v4(v2);for (int i = 0; i < v4.size(); i++){cout << v4[i] << " ";}cout << endl;vector<int> v3(++v2.begin(), --v2.end());vector<int>::iterator it = v3.begin();while (it != v3.end()){cout << *it << " ";it++;}cout << endl;vector<int> v5(20, 3);vector<int>::reverse_iterator rit = v5.rbegin();while (rit != v5.rend()){cout << *rit << " ";rit++;}cout << endl;return 0;
}

在这里插入图片描述

  • vector的析构函数

在这里插入图片描述

  • operator= ⁂

将新内容分配给容器,替换其当前内容,并相应地修改其大小。
在这里插入图片描述

#include<iostream>
#include<vector>using namespace std;void vector_test2()
{vector<int> v1(10, 1);vector<int> v2(20, 2);for (auto i : v2){cout << i << " ";}cout << endl;v2 = v1;for (auto i : v2){cout << i << " ";}cout << endl;}int main()
{vector_test2();return 0;
}

在这里插入图片描述

  • vector 空间增长问题

⁂ 代表重点

容量空间接口说明
size ⁂获取数据个数
max_size获取数据最大个数
resize ⁂改变vector的size
capacity ⁂获取数据容量大小
empty判断是否为空
reserve ⁂改变vector的capacity
shrink_to_fit减小容量大小使其适应数据
#include<iostream>
#include<vector>using namespace std;void vector_test3()
{vector<int> v(15, 2);cout << v.size() << endl;cout << v.capacity() << endl;v.resize(5);cout << v.size() << endl;cout << v.capacity() << endl;v.resize(20);cout << v.size() << endl;cout << v.capacity() << endl;v.reserve(5);cout << v.size() << endl;cout << v.capacity() << endl;v.reserve(50);cout << v.size() << endl;cout << v.capacity() << endl;cout << v.empty() << endl;v.shrink_to_fit();cout << v.size() << endl;cout << v.capacity() << endl;}int main()
{vector_test3();return 0;
}

在这里插入图片描述
注意:

  1. reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
  2. resize在开空间的同时还会进行初始化,影响size。
#include<iostream>
#include<vector>using namespace std;void TestVectorExpand()
{size_t sz;vector<int> v;sz = v.capacity();cout << "making v grow:\n";for (int i = 0; i < 100; ++i){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}
}int main()
{TestVectorExpand();	return 0;
}

在这里插入图片描述
由此可知在vs2020的环境下,扩容的速度是1.5倍速

#include<iostream>
#include<vector>using namespace std;void TestVectorExpand()
{size_t sz;vector<int> v;sz = v.capacity();v.reserve(100);cout << "making v grow:\n";for (int i = 0; i < 100; ++i){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}
}int main()
{TestVectorExpand();	return 0;
}

在这里插入图片描述

  • vector的调整

⁂ 代表重点

vector的调整接口说明
assign分配vector内容
push_back ⁂尾插
pop_back ⁂尾删
insert在position之前插入val
erase删除position位置的val
swap交换两个vector的数据空间
clear清除vector的数据
#include<iostream>
#include<vector>using namespace std;void vecotr_test4()
{vector<int> v(10,5);v.assign(5, 4);for (auto i : v){cout << i << " ";}cout << endl;vector<int> v2(10, 2);v2.push_back(6);for (auto i : v2){cout << i << " ";}cout << endl;v2.pop_back();for (auto i : v2){cout << i << " ";}cout << endl;vector<int> v3(10,3);vector<int>::iterator it = v3.begin();v3.insert(it,2, 1);for (auto i : v3){cout << i << " ";}cout << endl;vector<int>::iterator it2 = v3.begin();v3.erase(it2,it2+2);for (auto i : v3){cout << i << " ";}cout << endl;vector<int> v4(10, 1);vector<int> v5(5, 2);for (auto i : v4){cout << i << " ";}cout << endl;for (auto i : v5){cout << i << " ";}cout << endl;swap(v4, v5);for (auto i : v4){cout << i << " ";}cout << endl;for (auto i : v5){cout << i << " ";}cout << endl;v5.clear();for (auto i : v5){cout << i << " ";}cout << endl;
}int main()
{vecotr_test4();return 0;
}

在这里插入图片描述

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

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

相关文章

1.4 边界值分析法

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 定义2 选取3 具体步骤4 案例分析 本篇文章参考黑马程序员 前言 边界值分析法是一种广泛应用于软件测试中的技术&#xff0c;旨在识别输入值范围内的潜在缺陷。本文将详细探讨…

【Linux】深度解析与实战应用:GCC/G++编译器入门指南

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

Mysql—主从复制的slave添加及延迟回放

MySQL 主从复制是什么&#xff1f; ​ MySQL 主从复制是指数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式&#xff0c;这样从节点不用一直访问主服务器来更新自己的数据&#xff0c;数据的更新可以在远程连接上进行&#xff0c;…

滑动窗口专题

通过以下几道题来熟悉滑动窗口 滑动窗口3大问题&#xff1a;如何移入窗口&#xff0c;如何移出窗口&#xff0c;如何更新答案 209. 长度最小的子数组 我们考虑通过窗口来计算和&#xff0c;快慢指针从左开始遍历。 移入窗口&#xff1a;直接把当前元素加进来。 移出窗口&am…

重大喜讯!科研界之大变革——“5分钟提交+24小时反馈”,投稿效率直线上升!

盘点允许“一稿多投”的SCI “一稿多投”一直被认为是学术不端的行为&#xff0c;但“禁止一稿多投”是纸质时代遗留下的产物&#xff0c;已不符合当今社会的发展。 一篇文章一审就是好几个月甚至是一两年&#xff0c;在科研圈子里都是平常事&#xff0c;每个科研人都曾深陷于…

乐道L60、MONA M03、理想L6,蔚小理围剿「特斯拉」

作者 |老缅 编辑 |德新 9月19日&#xff0c;蔚来全新品牌乐道首款车型——乐道L60正式上市&#xff0c;定位家庭智能电动SUV。 60kWh标准续航版&#xff0c;售价20.69万元85kWh长续航版&#xff0c;售价23.59万元&#xff1b;如果采用BaaS电池租用服务&#xff0c;则低至14.9…

如何在云端使用 Browserless 进行网页抓取?

云浏览器是什么&#xff1f; 云浏览器是一种基于云的组合&#xff0c;它将网页浏览器应用程序与一个虚拟化的容器相结合&#xff0c;实现了远程浏览器隔离的概念。开发人员可以使用流行的工具&#xff08;如 Playwright 和​ Puppeteer​&#xff09;来自动化网页浏览器&#…

cmake--list

教程 list--链接 list关键字的作用 list的操作 list追加字符串--APPEND set(str1 "aaaaaaaa") message(STATUS "str1${str1}") list(APPEND str1 "bbbb") message(STATUS "str1${str1}") list字符串拼接并不是直接拼接&#xff0c…

C# 用Timer控件简单写一个倒计时60s功能

先放界面上一个Label和一个Timer控件&#xff0c;Label用来展示倒计时秒数 添加事件 设置属性&#xff0c;设置每隔一秒执行一次 放代码&#xff1a; //设置时间控件开始运行&#xff0c;具体放在哪里看具体需求 this.timer1.Start();//定义一个全局变量表示秒数 int time…

在线版宣传册是如何制作的

​亲爱的创作者们&#xff0c;你是否想过将传统的纸质宣传册升级为更具吸引力的在线版&#xff1f;在这个数字化时代&#xff0c;在线版宣传册不仅能够节省印刷成本&#xff0c;还能让信息传递更加迅速、精准。今天&#xff0c;就让我们一起探索在线版宣传册的制作奥秘吧&#…

利用Mongoose库实现MQTT通信

Mongoose官方Github地址 官方对于Mongoose的简介&#xff1a; Mongoose - Embedded Web Server / Embedded Network Library Mongoose is a network library for C/C. It provides event-driven non-blocking APIs for TCP, UDP, HTTP, WebSocket, MQTT, and other protocol…

【吉林一号卫星简介】

吉林一号卫星 吉林一号卫星是中国长光卫星技术有限公司研制的遥感卫星&#xff0c;也是该公司在建的核心工程&#xff0c;是中国重要的光学遥感卫星星座。以下是对吉林一号卫星的详细介绍&#xff1a; 一、卫星概况 中文名&#xff1a;吉林一号外文名&#xff1a;Jilin 1 Bus…

视频汇聚EasyCVR视频监控平台调取接口提示“认证过期”是什么原因?

视频汇聚EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。EasyCVR平台具备强大的拓展性和灵活性&#xff0c;支持多种视频流的外部分发&…

丝杆支撑座许用条件的解析

丝杆支撑座连接滚珠丝杆使用能够支撑滚珠丝杆&#xff0c;使之更加平稳的运动&#xff0c;显著提高传动效率、降低噪音、提高精度、延长使用寿命等优势&#xff0c;是自动化设备中重要的传动元件。影响丝杆支撑座的因素主要包括轴承类型、润滑脂的使用、密封圈的保护、使用环境…

实现边框渐变效果

实现思路&#xff1a;定义一个具有相对定位、白色背景和透明边框的元素。边框宽度为3像素&#xff0c;并且有20像素的圆角。通过background-clip: padding-box;确保背景不会延伸到边框之外。 使用一个伪元素&::before来创建一个渐变边框。这个伪元素被放置在主元素的外部&…

Qt-QComboBox输入类控件(31)

目录 描述 核心方法 核心信号 使用 代码方式 界面操作方式 动态使用 如何看待输入输出 String与QString互相转化 描述 一个可以下拉的输入框 核心方法 addItem(constQString&)添加⼀个条⽬currentIndex()获取当前条⽬的下标 从0开始计算.如果当前没有条⽬被选中…

Xcode 16 上传AppStore遇到第三方库 bitcode 的问题

Xcode 16 上传AppStore遇到第三方库 bitcode 的问题 最近两天更新了Xcode 16&#xff0c;然后正好要发布新版本的App&#xff0c;打包Adhoc没问题&#xff0c;但是上传AppStoreConnect或者TestFlight就不行解决方案参考资料 最近两天更新了Xcode 16&#xff0c;然后正好要发布新…

RegNet(CVPR2020):Designing Network Design Spaces,设计一个网络设计空间!

RegNet&#xff1a;Designing Network Design Spaces RegNet&#xff1a;设计一个网络设计空间 论文地址&#xff1a; https://arxiv.org/pdf/2003.13678 1、前言 在这项工作中&#xff0c;作者提出了一种新的网络设计范例。 作者的目标是帮助增进对网络设计的理解并发现跨设置…

【js逆向学习】酷我音乐排行榜 python+nodejs(webpack)

逆向目标 目标网址: https://www.kuwo.cn/rankList目标接口: https://www.kuwo.cn/api/www/bang/bang/musicList 加密参数: 参数一&#xff1a;secret参数二&#xff1a;reqId 逆向过程 老规矩先分析网络请求&#xff0c;我们可以分析到网络请求是通过ajax进行的&#xff…

【研赛E题成品论文】24华为杯数学建模研赛E题成品论文+可运行代码丨免费分享

2024华为杯研究生数学建模竞赛E题成品论文已出&#xff01; E题 高速公路应急车道紧急启用模型 一、问题一模型建立与求解 1.1 问题一求解思路 赛题要求我们基于四个观测点的视频数据&#xff0c;提取交通流参数并分析这些参数随时间的变化规律。交通流参数包括&#xff1a;…