c++04STL部分复习

news2024/10/5 18:23:43

1、deque list vector概括:

/*
deque :双端队列容器
底层数据结构:动态开辟的二维数组,一维数组从2开始,以2倍的方式进行扩容,每次扩容后,原来的第二维的数组
从新的第一堆数组下表的oldsize/2开始存放,上下都预留空行,方便支持首位元素的添加

deque<int>deq;
deq.push_back(20);
deq.push_front(20) 首尾添加都是O(1)
deq.insert(it,20);添加元素O(n)

删除操作:
deq.pop_back();从末尾删除元素
deq.pop_front();从首部删除元素
deq.erase(it);从it指向的位置删除元素

迭代器:
iterator(连续的insert和erase考虑迭代器失效的问题)

list:链表容器
底层数据结构:双向的循环链表
list<int> mylist;
增加:
push_back O(1)
push_front O(1)
insert(it,20)  it指向的位置添加元素O(1) 先要查询,效率很慢

删除:
pop_back(); O(1)
pop_front();O(1)
erase(it) O(n)

查询搜索:
iterator

Vector:向量容器
底层数据结构:动态开辟的数组,每次以原来空间大小的2倍进行扩容的

vector<int>vec;
增加:push_back O(1) 导致扩容
vec.insert(it,20) 迭代器指向的位置添加一个元素

删除:
vec.pop_back() 删除元素末尾
vec.erase(it);
查询:迭代器
operator[] 下标随机访问 vec[5] O(1)
iterator迭代器进行遍历
find for_each
foreach => 通过迭代器实现的

注意:对容器连续插入或者删除小心迭代器失效
常用方法介绍:
size()
empty()
reserve(20);vector预留的空间的
resize(20);扩容的
swap;交换
*/

#include<vector>
#include<time.h>
#include<iostream>
using namespace std;

int main()
{
	vector<int>vec;
	for (int i = 0; i < 20; i++)
	{
		vec.push_back(rand() % 101);
	}
	int size = vec.size();
	for (int i = 0; i < size; i++)
	{
		cout << vec[i] << " ";
	}
	cout << endl;
	vector<int>::iterator it = vec.begin();
	while (it != vec.end())
	{
		cout << *it << " ";
		it++;
	}
	vector<int>::iterator it1 = vec.begin();
	while (it1 != vec.end())
	{
		if (*it1 % 2 == 0)
		{
			it1 = vec.erase(it1); //不是偶数的时候才要++
			continue;
		}
		it1++;
	}
	cout << endl;
	vector<int>::iterator it2 = vec.begin();
	while (vec.end() != it2)
	{
		cout << *it2 << " ";
		it2++;
	}
	return 0;
}

2、vector list deque 对比


#if 0
vector特点:动态数组、内存是连续的,2倍的方式进行扩容
deque:动态开辟的二维数组空间,第二维是固定的长度的数组空间
扩容的时候第一维的数组进行2倍扩容

vector和deque之间的区别:
1、底层数据结构
2、前中后插入删除元素的时间复杂度:中间和末尾O(1) 前deque (1)
3 对于内存使用效率,vector需要的内存空间必须是连续的,deque可以分块进行数据存储
不需要内存空间必须是连续一片
4、再中间进行insert或者erase,vector和deque他们的效率谁能更好一点(vector)?谁能差一点(deque)?O(n)
5、vector和list之间的区别? 数组:增加删除O(n) 查询O(n) 随机访问O(1) 链表:(考虑搜索的时间)增加删除O(1)
1、底层数据结构 :数组 双向循环链表
#endif

3、函数对象

在这里插入图片描述


#if 0
/*仿函数的好处*/



#include<iostream>
using namespace std;
#if 0
template<typename T>
inline bool _greater(T a, T b)
{
	return a > b;
}
template<typename T>
inline bool _less(T a, T b)
{
	return a < b;
}
#endif 


//c++函数对象实现
/*
1、通过函数对象调用operator(),可以省略函数的调用开销,比通过
函数指针调用函数(不能够inline内联调用)效率高
2、可以添加想要的属性因为用类生成的
*/
template<typename T>
class _greater
{
public:
	bool operator()(T a, T b)
	{
		return a > b;
	}

private:
	int _count;
};
template<typename T>
class _less
{
public:
	bool operator()(T a, T b)
	{
		return a < b;
	}
};

template<typename T, typename Compare>
bool compare(T a, T b, Compare comp)
{
	return comp(a, b);  //通过函数指针调用函数,是没有办法内敛的,
	//效率很低因为有函数调用开销
	// operator() (a,b)
}

int main()
{
	cout << compare(10, 20, _greater<int>()) << endl;
	cout << compare('b', 'y', _less<char>()) << endl;
	return 0;
}

#endif

#include<iostream>
#include<queue>
#include<set>
#include<vector>
using namespace std;

int main()
{
	set<int, greater<int>>set1;
	for (int i = 0; i < 10; i++)
	{
		set1.insert(rand() % 100);
	}
	for (int v : set1)
	{
		cout << v << " ";
	}
	cout << endl;
	return 0;
}

#if 0
int main()
{

	priority_queue<int>que; //vector
	for (int i = 0; i < 10; i++)
	{
		que.push(rand() % 101);
	}
	while (!que.empty())
	{
		cout << que.top() << " ";
		que.pop();

	}
	cout << endl;
	using MinHeap = priority_queue<int, vector<int>, greater<int>>;
	MinHeap que1; //vector
	for (int i = 0; i < 10; i++)
	{
		que1.push(rand() % 101);
	}
	while (!que1.empty())
	{
		cout << que1.top() << " ";
		que1.pop();

	}

	return 0;
}
#endif

4、容器适配器

#include<iostream>
#include<vector>
#include<deque>
#include<list>
#include<stack>
#include<queue>
#include<time.h>
using namespace std;

/*
标准容器 - 容器适配器 -> 设计模式,就叫适配器模式
怎么理解这个适配器?
1、适配器底层没有自己的数据结构,它是另外一个容器的封装,它的方法全部依赖于底层容器的实现
2、没有实现自己的迭代器
*/

#if 0
template<typename T, typename Container = deque<T>>
class Stack
{
public:
	void push(const T& val) { con.push_back(val); }
	void pop() { con.pop_back(); }
	T top() const { return con.back(); }
private:
	Container  con;
};
#endif


int main()
{
	//同理priority_queue<int>que;
	queue<int> que;
	for (int i = 0; i < 20; i++)
	{
		que.push(rand() % 100 + 1);
	}
	cout << que.size() << endl;
	while (!que.empty())
	{
		cout << que.front() << " ";
		que.pop();
	}
	cout << endl;
#if 0
	//push入栈 pop出线 top查看栈顶元素  empty判断栈空  size返回元素个数
	stack<int>s;
	for (int i = 0; i < 20; i++)
	{
		s.push(rand() % 100 + 1);
	}
	cout << s.size() << endl;
	while (!s.empty())
	{
		cout << s.top() << " ";
		s.pop();
	}
#endif
	cout << endl;
	return 0;
}

在这里插入图片描述

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

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

相关文章

XYCTF - web

目录 warm up ezMake ezhttp ezmd5 牢牢记住&#xff0c;逝者为大 ezPOP 我是一个复读机 ezSerialize 第一关 第二关 第三关 第一种方法&#xff1a; 第二种方法&#xff1a; ez?Make 方法一&#xff1a;利用反弹shell 方法二&#xff1a;通过进制编码绕过 ε…

EasyImage2.0 图床源码

EasyImage2.0 是一个简单图床的源码&#xff0c;它支持以下功能&#xff1a; 1. API接口 2. 登录后才能上传图片 3. 设置图片质量 4. 压缩图片大小 5. 添加文字或图片水印 6. 设定图片的宽度和高度 7. 将上传的图片转换为指定的格式 8. 限制上传图片的最小宽度和高度 …

《软件方法(下)》8.3.3 泛化的一些重点讨论(202405更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.3 泛化的一些重点讨论 8.3.3.1 子集的不相交和完整 泛化是集合关系&#xff0c;在建模泛化关系时&#xff0c;我们对泛化关系中的子类&#xff0…

JavaEE初阶-多线程5

文章目录 一、线程池1.1 线程池相关概念1.2 线程池标准类1.3 线程池工厂类1.4 实现自己的线程池 二、定时器2.1 java标准库中的定时器使用2.2 实现一个自己的定时器2.2.1 定义任务类2.2.2 定义定时器 一、线程池 1.1 线程池相关概念 池这个概念在计算机中比较常见&#xff0c…

极验4图标方向点选验证码

验证码如下如所示&#xff0c;提供了三个方向剪头。根据剪头顺序&#xff0c;点击大图中图标的方向完成验证。 经过我们的努力&#xff0c;正确率达到了90%左右。下面提供了验证码识别的代码。 import base64 import requests import datetime from io import BytesIO from PI…

Linux-软件安装--tomcat的安装

tomcat的安装 1、下载tomcat安装包2.移动到自己想要解压的目录3、解压文件夹4、启动tomcat5、查看tomcat进程6、查看日志7、通过浏览器访问成功8、停止tomecat服务8.1运行tomcat的bin目录中提供的停止服务的脚本文件shutdcwn.sh8.2结束tomcat进程1、下载tomcat安装包 本篇文章…

蓝海创业商机小吃配方项目,日入200+ ,小白可上手,图文创作转现快

小吃技术销售&#xff0c;一单价格从几元到几百元不等&#xff0c;行业竞争相对较小&#xff0c;是一个相对冷门的领域。只需一部手机&#xff0c;就可以发布图文并茂的内容&#xff0c;配上背景音乐&#xff08;BGM&#xff09;&#xff0c;即使是对视频剪辑不熟悉的新手&…

【WEEK11】 【DAY6】Employee Management System Part 7【English Version】

2024.5.11 Saturday Continued from 【WEEK11】 【DAY5】Employee Management System Part 6【English Version】 Contents 10.8. Delete and 404 Handling10.8.1. Modify list.html10.8.2. Modify EmployeeController.java10.8.3. Restart10.8.4. 404 Page Handling10.8.4.1. …

如何取消格式化SD卡并恢复丢失的数据?

在相机中格式化SD卡后&#xff0c;您将丢失卡上的所有文件。如果有恢复形成操作的选项&#xff0c;您可以轻松取回文件。然而&#xff0c;相机或任何其他设备中没有这样的选项。它无法直接取消格式化相机SD卡&#xff0c;但您仍然可以从格式化的SD卡中恢复文件。 为什么格式化后…

excel常见图表大全

Excel图表是一种以图形形式呈现数据的工具&#xff0c;它将数字和统计信息转化为直观的视觉元素&#xff0c;如线图、柱状图、饼图等。这些图表可以帮助人们更容易地理解数据的趋势、关系和模式。 使用场景 Excel图表广泛应用于各个领域&#xff0c;包括&#xff1a; 商务分…

服装定制|基于SSM+vue的服装定制系统的设计与实现(源码+数据库+文档)

服装定制系统 目录 基于SSM&#xff0b;vue的服装定制系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户后台管理模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

基于Springboot的村庄果园预售系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的村庄果园预售系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

2024情感聊天赛道,al工具制做,视频一分钟一条,日入500+

在这个领域&#xff0c;我们可以利用AI技术快速制作情感文章和闲聊内容。基本原理是结合热门创意文案&#xff0c;通过AI生成情感聊天短视频&#xff0c;然后在各大网站进行独家代理&#xff0c;这个领域的竞争相对较小&#xff0c;可以说是一片蓝海。 项 目 地 址 &#xff…

【目标检测论文解读复现NO.38】基于改进YOLOv8模型的轻量化板栗果实识别方法

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

【机器学习】LoFTR:革命性图像特征批评技术等领跑者

LoFTR&#xff1a;革命性图像特征匹配技术的领跑者 一、引言二、LoFTR技术的创新之处三、LoFTR技术的实现原理四、LoFTR技术的代码实例五、结语 一、引言 在3D计算机视觉领域&#xff0c;图像特征匹配技术一直是研究的热点和难点。随着技术的不断发展&#xff0c;传统的特征检…

电子学会C/C++编程等级考试2024年03月(八级)真题解析

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数&#xff1a;道路的长度和需要为该路付的通行费&#xff08;以金币的数目来表示&#xff09; Bob and Alice 过去住在城市 1.在…

ACE框架学习4

目录 ACE Proactor框架 异步I/O工厂类 ACE_Handler类 前摄式Acceptor-Connector类 ACE_Proactor类 ACE Streams框架 ACE_Model类 ACE_Streams类 ACE Proactor框架 ACE Proactor框架实现了proactor模式&#xff0c;也就是异步网络模式&#xff0c;允许事件驱动…

并行执行线程资源管理方式——《OceanBase 并行执行》系列 3

在某些特定场景下&#xff0c;由于需要等待线程资源&#xff0c;并行查询会遇到排队等待的情况。本篇博客将介绍如何管理并行执行线程资源&#xff0c;以解决这种问题。 《OceanBase并行执行》系列的内容分为七篇博客&#xff0c;本篇是其中的第三篇。前2篇如下&#xff1a; 一…

容器组件:Column ,Row(HarmonyOS学习第四课【4.1】)

容器组件-Column Column 容器组件是沿垂直方向布局的容器。该组件从APIVersion7开始支持从API version 9开始&#xff0c;该接口支持在ArkTs,卡片中使用。其可以包含子组件 Column(value?: {space?: string | number}) 参数 space 参数类型string | number 是否必填&am…

锁策略详解:互斥锁、读写锁、乐观锁与悲观锁、轻量级锁与重量级锁、自旋锁、偏向锁、可重入锁与不可重入锁、公平锁与非公平锁

一.锁策略 锁策略指的是在多线程编程中用于管理共享资源访问的规则和技术。它们确保在任何给定时间只有一个线程可以访问共享资源&#xff0c;以防止竞态条件和数据不一致性问题。常见的锁策略包括&#xff1a; 互斥锁&#xff08;Mutex&#xff09;&#xff1a;最常见的锁类型…