C++容器

news/2025/3/19 20:24:59/文章来源:https://www.cnblogs.com/polang19/p/18781715

容器的分类

截图.png

分为顺序容器(sequence) 关联容器(asscoiative) 无序容器(unordered)

顺序容器Array、vector、deque、list

关联容器有(mul)set和(mul)map,set和map的区别在于,set的key就是value,而map的key和value是分开的,set和map内部都是通过红黑树实现

无序容器主要为拉链法实现的散列表

测试辅助函数

截图.png

using std::cin;using std::cout;using std::string;long get_a_target_long(){long target = 0;cout<<"target (0 ~"<<RAND_MAX<<"):";cin>>target;return target;}string get_a_target_string(){long target;char buf[10];cout<<"target (0 ~"<<RAND_MAX<<"):";cin>>target;snprintf(buf,10,"%d"target);return target;}int compareLongs(const void* a,const void* b){return (*(long*)a - *(long*)b);}int compareStrings(const void* a,const void* b){if (*(string)a > *(string*)b)return 1;else if (*(string)a < *(string*)b)return -1;elsereturn 0;}

 

1、Array

截图.png

运行结果

截图.png

 

 

const long ASIZE = 500000L;#include<array>#include<iostream>#include<ctime>#include<cstdlib>namespace JJ01{void test_array(){cout<<"test_array().......\n";//

std::array<long,ASIZE> c;clock_t timeStart = clock();for (long i = 0;i < ASIZE;i++){c[i] = rand();}//

cout << "milli-seconds : " << (clock() - timeStart)<<std::endl;//

cout << "array.size()= " << c.size() << std::endl;cout << "array.front()= " << c.front() << std::endl;cout << "array.back()= " << c.back() << std::endl;cout << "array.data()= " << c.data() << std::endl;//

long target = get_a_target_long();//

timeStart = clock();qsort(c.data(),ASIZE,sizeof(long),compareLongs);long* pItem = (long*)bsearch(&target,c.data(),ASIZE,sizeof(long),compareLongs);cout<<"qsort()+bsearch(),milli-sconds:"<<clock() - timeStart<<std::endl;if (pItem != NULL)cout<<"found,"<<*pItem<<std::endl;elsecout<<"not found!"<<std::endl;}}int main(){using namespace JJ01;test_array();return 0;}

 

2、Vector

截图.png

截图.png

关于vector的内存容量分配,如果vector发现内存容量不足时,会在当前容量的基础上变为原来的两倍(代码中的C++版本是这样的,后面版本变动可能会有所修改),过程就是找一块可用内存,大小为当前内存的两倍,然后把数据拷贝过去,然后释放当前内存

截图.png

 

 

const long ASIZE = 500000L;#include<vector>#include<stdexcept>#include<string>#include<cstdlib>#include<cstdio>#include<iostream>#include<ctime>#include<algorithm>namespace JJ02{void test_Vector(){cout<<"test_Vector()......."<<std::endl;//

std::vector<string> c;char buf[10];//

clock_t timeStart = clock();for (long i = 0;i <ASIZE;++i){try{_snprintf(buf,10,"%d",rand());c.push_back(string(buf));}catch(std::exception& p){cout<<"i = "<<i<<" "<<p.what()<<std::endl;//分配失败

abort();}}//

cout<<"milli-seconds : "<<(clock() - timeStart)<<std::endl;cout<<"vector.size() = "<<c.size()<<std::endl;cout<<"vector.front() = "<<c.front()<<std::endl;cout<<"vector.back() = "<<c.back()<<std::endl;cout<<"vector.data() = "<<c.data()<<std::endl;cout<<"vector.capacity() = "<<c.capacity()<<std::endl;//

string target = get_a_target_string();{timeStart = clock();auto pItem = std::find(c.begin(),c.end(),target);cout<<"::find(),milli-second = "<<(clock() - timeStart)<<std::endl;if (pItem != c.end())cout<<"found : "<<*pItem<<std::endl;elsecout<<"not found!"<<std::endl;}//

{timeStart = clock();sort(c.begin(),c.end());string* pItem = (string*)bsearch(&target,c.data(),c.size(),sizeof(string),compareStrings);//

cout<<"sort() + bsearch(),milli-second = "<<(clock() - timeStart)<<std::endl;//

if (pItem != NULL)cout<<"find : "<<*pItem<<std::endl;elsecout<<"not found"<<std::endl;}}}int main(){using namespace JJ02;test_Vector();return 0;}

 

3、List和forward_list

 

截图.png

list链表没有什么好讲的,比较常规,他分配内存的方式就是一个一个分配,

#include<list>#include<stdexcept>#include<string>#include<cstdlib>#include<cstdio>#include<iostream>#include<ctime>#include<algorithm>namespace JJ03{void test_List(){cout<<"test_List........"<<std::endl;//

std::list<string> c;char buf[10];clock_t timeStart = clock();//

for (long i = 0;i < ASIZE;i++){try{_snprintf(buf,10,"%d",rand());c.push_back(string(buf));}catch(std::exception& p) {cout<<"i = "<<i<<" "<<p.what()<<std::endl;abort();}}cout<<"milli-seconds : "<<(clock() - timeStart)<<std::endl;cout<<"list.size() : "<<c.size()<<std::endl;cout<<"list.max_size() : "<<c.max_size()<<std::endl;cout<<"list.front() : "<<c.front()<<std::endl;cout<<"list.back() : "<<c.back()<<std::endl;//

string target = get_a_target_string();timeStart = clock();auto pItem = std::find(c.begin(),c.end(),target);cout<<"std::find,milli-second : "<<(clock() - timeStart)<<std::endl;if (pItem != c.end())cout<<"find, Item = "<<*pItem<<std::endl;elsecout<<"not found!"<<std::endl;timeStart = clock();c.sort();cout<<"sort,milli-second : "<<(clock() - timeStart)<<std::endl;}}int main(){using namespace JJ03;test_List();return 0;}实现list的size和max_size/* Return the number of elements of in the list*/size_typesize() const _GILBCXX_NOEXCEPT{return std::distance(begin(),end());}/* return the size() of the largest posiible list*/size_typemax_size() _GILBCXX_NOEXCEPT{return _M_get_Node_allocator().max_size();}

 

运行截图

截图.png

4、deque

截图.png

通常我们认为deque中的中的元素是连续的,但其实不是,deque中存放的是一个个的buffer,每个buffer相当于一个数组,但是头尾都可以进行操作,当进行操作的时候,如果迭代器到了buffer的尾端需要进行判断,如果到了就需要切换到下一个buffer,每个buffer之间可能是不连续的,用指针相连,相当于是一个buffer的链表

截图.png

#include<deque>#include<stdexcept>#include<string>#include<cstdlib>#include<cstdio>#include<iostream>#include<ctime>#include<algorithm>namespace JJ05{void test_deque(){cout<<"test_Deque()......."<<std::endl;//

std::deque<string> c;char buf[10];//

clock_t timeStart = clock();for (long i = 0;i <ASIZE;++i){try{_snprintf(buf,10,"%d",rand());c.push_back(string(buf));}catch(std::exception& p){cout<<"i = "<<i<<" "<<p.what()<<std::endl;//分配失败

abort();}}//

cout<<"milli-seconds : "<<(clock() - timeStart)<<std::endl;cout<<"deque.size() = "<<c.size()<<std::endl;cout<<"deque.front() = "<<c.front()<<std::endl;cout<<"deque.back() = "<<c.back()<<std::endl;//cout<<"deque.data() = "<<c.data()<<std::endl;

cout<<"deque.max_size() = "<<c.max_size()<<std::endl;//

string target = get_a_target_string();{timeStart = clock();auto pItem = std::find(c.begin(),c.end(),target);cout<<"::find(),milli-second = "<<(clock() - timeStart)<<std::endl;if (pItem != c.end())cout<<"found : "<<*pItem<<std::endl;elsecout<<"not found!"<<std::endl;}//

{timeStart = clock();std::sort(c.begin(),c.end());//

cout<<"sort() + bsearch(),milli-second = "<<(clock() - timeStart)<<std::endl;}}}int main(){using namespace JJ05;test_deque();return 0;}

 

运行截图

 

截图.png

5、stack和queue

 

截图.png

截图.png

stack和queue严格意义上不算container,而相当于adapter,因为他们相当于是deque的应用

所以说可以分为adapter而不是container

运行截图

截图.png

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core奇技淫巧之WinForm使用Python.NET并打包

前言 之前整了一个GZY.EFCoreCompare 的库,可以用做对比实体与数据库结构.感兴趣可以去看看,地址:GZY.EFCoreCompare 但是只能导出execl表格. 后来大佬用Python写了个类,可以将execl表格直接生成SQL语句. 但是需要通过开发工具 或者python环境去运行. 对现场的非技术人员很不友…

MCP Server 开发实战指南(Python版)

原文链接:https://www.ryanzoe.top/ai/mcp-server-%e5%bc%80%e5%8f%91%e6%95%99%e7%a8%8b/ MCP 官方文档https://modelcontextprotocol.io/introduction各个 clients 对 MCP 的支持情况https://modelcontextprotocol.io/clientsMCP Python SDK:MCP Client 和 Server 官方 SDK…

Amphion 推出合成音频鉴别系统 Auditi;Gemini 引入 NotebookLM 功能,生成文档、网页音频摘要丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

洛谷题单指南-图论之树-P3398 仓鼠找 sugar

原题链接:https://www.luogu.com.cn/problem/P3398 题意解读:一颗n个节点的树,m个判断,判断树上两条路径是否相交,相交输出Y,否则输出N 解题思路:此题需要画一棵多叉树来辅助判断多次观察相交的路径,可以得出一个关键性质: 两条路径相交,必然有一条路径的LCA在另一条…

lg 主页

\(\Large\text{My Blog}\)中学:济南天山高级实验中学 关于我的学校究极久远预告:寒假游记滚滚长江东逝水,浪花淘尽英雄 是非成败转头空 青山依旧在,几度夕阳红 白发渔樵江渚上,观看秋月春风 一壶浊酒喜相逢 古今多少事,都付笑谈中街喧闹,人过往 且记曾相识,莫为少年留 …

day:25 selenium之介绍和环境配置

一、selenium介绍 selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试和验证 (2)减少测试人员在回归测试时用例漏测和验证点的漏测 (3…

[算法学习记录] [更新中]最短路

顾名思义,最短路算法,就是求一个图中所有的点距某一个点的最短距离,常见的有Dijkstra算法、Bellman-Ford算法、Johnson算法与Floyd算法。 Dijkstra Dijistra算法实际上是一种由贪心与动态规划结合的算法,我们每次都贪心地选择到某个点的最近距离,又动态地更新着距离数组d的…

day6-static静态变量

静态变量/静态方法 被static修饰 工具类静态方法不能调用非静态。 非静态可以访问所有。 继承一个子类只能继承一个父类,可以多层继承,最大的父类为Objectcoding 练习:更好的方法:双指针不浪费空间

SpringBoot引入JWT实现用户校验

一JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。这些信息以JSON对象的形式存储在令牌中,并且可以被签名和加密。JWT通常用于身份验证和信息交换主要用途 身份验证:当用户登录成功后,服务器会生成一个JWT并返回给客户端。之后…

mcp-playwright测评

mcp-playwright介绍 mcp-playwright是一个使用 Playwright 提供浏览器自动化能力的模型上下文协议服务器。该服务器使 LLMs 能够与网页交互、截屏,并在真实的浏览器环境中执行 JavaScript。 GitHub地址:https://github.com/executeautomation/mcp-playwright。安装 npm insta…

传媒行业项目管理全解析:日事清在流程、文件、数据与风控中的一体化应用

一、关于森可文化 森可文化传媒有限公司(Senke Vision)占据了超过2800平方米的宽敞办公及拍摄场地,与众多内衣及服饰行业的上市巨头建立了不可动摇的深度合作关系。 Senke Vision汇聚了国内外顶尖的策划、设计、摄影摄像、服装搭配、化妆及品牌视觉顾问,形成了一支独一无二…

在 .NET 项目中使用 husky 完成 pre-commit 操作

将 husky 引入 .NET 项目Husky 是一个用于 Git 仓库的工具,主要用于管理 Git 钩子(hooks)。它可以帮助开发者在特定的 Git 操作(如提交、推送等)之前或之后执行自定义的脚本或命令,从而提高代码质量和团队协作效率。 主要用在前端项目中,可以通过 Husky.Net,将 Husky 的…