STL容器

使用STL容器还是Qt容器? 在C++编程中,选择合适的容器库对于编写高效、可维护的代码至关重要。两大主流选择是STL容器(如std::map等)和Qt容器(如QMapQVector等)。本文将探讨两者的优缺点,以帮助开发者在特定应用场景中做出更好的选择。 阅读详情

解决STL编译警告的方法,在头文件的include代码前加上:#pragma warning (disable : 4786)

         注:disable 后边是警告代号。

一     序列

1)         vector模板类(头文件为vector,老版本为vector.h)

数组的一种类表示,可反转容器,rbegin()和rend()分别指向反转序列的第一个和超尾叠待器,类型为reverse_iterator。

1.       使用方法

                   vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:

          using std::vector;

                   vector<int> vec;

                   或者连在一起,使用全名:

                   std::vector<int> vInts;

2.       vector的主要方法:

1)       向vector添加一个数据

vector添加数据的缺省方法是push_back()。push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存。

2)       访问vector中的数据

使用两种方法来访问vector。

                   1、   vector::at()

                   2、   vector::operator[]

operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:’

         vector<int> v;

         v.reserve(10);

         for(int i=0; i<7; i++)

              v.push_back(i);

         try

         {

                   int iVal1 = v[7];  // not bounds checked - will not throw

                   int iVal2 = v.at(7); // bounds checked - will throw if out of range

         }

         catch(const exception& e)

         {

                 cout << e.what();

}

         3)      删除vector中的数据

vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当你删除数据的时候,你应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。在考虑删除等操作之前让我们静下来考虑一下在STL中的一些应用。

5.      对矢量可执行的其他操作(非成员函数)

1.      or_each(iterator1,iterator2,function_name);//对矢量区间[iterator1,iterator2)中的每个元素执行函数function_name.

2.      random_shuffle(itr1,itr2);//随即排列矢量区间[iterator1,iterator2)中的元素。要求容器支持随即访问。

3.      对于基本类型,使用sort(itr1,itr2).对矢量区间[iterator1,iterator2)排序(升序)。

对于用户定义的对象(如结构体),需要定义能够处理该类型对象的成员或非成员函数{如operator <(const type & r1,const type &r2)},再使用上述函数。

如果想按别的数据域排序,则可用sort(itr1,itr2,function_name);//function_name的返回值必须能转换成bool类型。

C++将operator++()作为重载++前缀版本,operator++(int)作为后缀版本(其中参数永远都不会用到)。

2)      deque(头文件queue,是一个适配器类)

deque 和vector一样都是标准模板库中的内容,deque 是双端队列,在接口上和vector 非常相似,在许多操作的地方可以直接替换。vector在默认情况下是典型的使用序列的方法,对于deque,当使用插入删除操作的时候是一个更好的选择。

         1.      细读上面两张表格,你会发现和vector比较这里增加了两个函数。

push_front(elem) —— 在头部插入一个数据。

pop_front() —— 删除头部数据。

相对于vector 缺少了两个函数

 capacity() —— 返回vector当前的容量。

 reserve() —— 给指定大小的vector 分配空间。

deque是大块大块地分配内存,每次插入固定数量的数据。vector是就近分配内存。

         2.      当执行大数据量的调用push_back()的时候,记住要调用vector::reserve()。

         deque分配的空间是预先分配好的,deque维持一个固定增长率,在vector实验中我们考虑到应该调用vecor::reserve().然后在下面这个例子验证了我们的假设,在使用vector的时候调用reserve()能够膀子我们预先分配空间,这将是vector一个默认选择的操作。

         3.      当你分配很多内存单元的时候,记住使用deque回收内存要比vector消耗时间多。

         在实验三中我们探讨了vector和deque在回收非邻接内存块上的不同,分别证明了vector在分配内存的时候是线性增长,而deque是指数增长,同样,vector要回收的内存比deque多的多,如果你循环调用了push_back(),那么deque将获取大量的内存,而且是临近的。我们通过测试发现在分配内存单元消耗的时间和vector的时间接近。

         4.      如果你计划使用insert(),或者需要pop_front(),那就使用deque。

         5.      对于访问数据,vector::at()效率最高。

3)      list(头文件list,双向链表,可反转容器)

         在任一位置的插入和删除的时间都是固定的,不能随记存取。

         与失量迭代器不一样,从容器中插入和删除元素后,迭代器所指向的元素不变。

         常用成员函数:

函数

说明

void merge<list<T, Alloc>&x>

将都已经排序的链表x合并到调用链表中,并且排序,x为空。时间复杂度为线性时间。

void remove(const T & val)

从链表中删除val的所有实例。线性时间。

void sort()

使用<操作符对列表排序。时间复杂度为:NlogN

void splice(iterator pos, list<T, Alloc> x)

将链表x的内容插入到pos的前面,x将为空。固定时间。

void unique()

将连续相同的元素压缩为单个元素。线性时间。

说明:                   splice()方法执行后,迭代其仍然有效。unique()只能将相邻的相同值压缩为单个值。若想每个值占一个位置,应先sort()后再调用unique().

         非成员函数,要求随即访问迭代器,所以不能用于链表中。

4)  queue(头文件queue,是一个适配器类)

         操作:

方法

说明

bool empty() const

队列为空,返回true,否则返回false

size_type size() const

返回队列中元素的数目

T& front()

返回指向队首元素的引用

T& back()

返回指向队尾元素的引用

void push(const T& x)

在队尾插入x

void pop()

删除队首元素

5)  priority_queue(头文件queue,默认的底层类是vector)

         最大的元素被移到队首。

         使用方法:        priority_queue<int> pq1             priority_queue(<greater<int>>)

         greater<>()是一个欲定义的函数对象,确定哪个元素放到队首的比较方式。

6)  stack(头文件stack,底层类vector,是一个适配器类)

         基本操作:

方法

说明

bool empty() const

如果堆栈为空,则返回true;否则返回false

size_type size() const

返回堆栈中的元素数目

T& top()

返回指向栈顶元素的引用

void pop()

删除栈顶元素

void push(const T& x)

在堆栈顶部插入x

二     联合容器(对容器概念的另一个改造,将值与关键字关联在一起)

1.   set(set,前set.h):可反转,可排序,关键字是唯一的,只能存储同一类型的值。

用法如:

1)      set<string> a;   

2)      set<string, less<string>> b;                 第二个参数用于指示用来对关键字进行排序的比较函数或对象,默认使用less<>模板。

3)      set<string> A(s1,s1+3);     s1为string数组                 即将一个迭代区间作为参数的构造函数,区间的最后一个元素是超尾符,关键字是唯一的且被排序。

常用方法:

1)      显示集合A和结合B的并集:                   
              set_uniton(A.begin(),A.end(),B.begin(),B.end(),ostream_iterator<string, char> out(cout,” ”))

2)      联合集合将关键字看作是常量,故C.begin()返回的是一个固定迭代器。set_union()将覆盖容器中的已有数据,并要求容器有足够的空间来容纳新信息。

3)      将两个区间复制到一个新的容器集合:

set_union(A.begin(),  A.end, B.begin(), B.end(), insert_iterator<set<string>>(C, C.begin()))

将复制转化为插入。

set_intersection()和set_difference()查找交集和获得两个交集的差,接口与set_union()相同。

 4)   lower_bound()将关键字作为参数并返回一个迭代器,该迭代器指向第一个不小于关键字集合的成员,同理upper_bound()返回的迭代器指向集合中第一个大于关键字参数的成员。

2.   multiset(set,前multiset.h)

                   可能有多个值得关键字相同。

3.   map(map,前map.h)

         用法如:

                   map<string, int> wordmap;

                   set<string>::iterator si;

                   set<string> wordset;

                   for(si=wordset.begin(); si!=wordset.end(); si++)

                            wordmap.insert(pair<string, int>(*si, count(words.begin(), words.end(), *si)));

                            //wordmap[*si]=count(words.begin(), words.end, * si);

4.   multimap(map,前multimap.h , 可反转的,经过排序的联合器):一个关键字可以与多个值相关联。

         关键字的类型与值类型不同,特定的关键字可与多个值相关联。

         1)      使用方法:

                   multimap<int, string> codes;//第一个参数为关键字的类型,第二个单数为所存储值得类型。可选的第三个参数用于指出对关键字进行排序的比较函数或对象。默认使用less<>模板,将关键字类型作为参数。

         2)      点对:为将信息结合在一起,可将关键字类型与数据类型结合为一对,方法为使用STL的pair<Class T, Class U>模板将两种对象结合到一个对象中,值类型为pair<const keytype, datatype>。

使用方法:

pair<const int, string> item(213, “Los Angeles”);

codes.insert(item);    或者

codes.insert(pair<const int, string> (123, “Los Angeles”));

           使用first和second来分别访问pair对象的两个部分,用法如:
  
cout<<item.first<<” ”<<item.second<<endl.

 3)    基本成员方法:

count()用关键字作参数,返回具有该关键字的元素的数目。

lower_bound()和upper_bound()将关键字作为对象,工作方式与set相同。

                  equal_range() 用关键字作参数,返回与该关键字匹配的区间的迭代器,返回的两个值封装在一个pair对象中,此时连个模板参数是迭代其类型。用法如:

pair<multimap<KeyType, string>::iterator,

multimap<KeyType, string>::iterator> range=codes.equal_range(718).

for(it=range.first; it!=range.second; ++it){

         cout<<(*it).second<<endl;

}

记二开金蝶云星空动态表单艰辛历程 整个过程,开发接近一周,期间也有做其他事,遇到不会的第一时间也是找金蝶社区,搜索有无相关的解决问题经历。再就是问同事,最终还不能解决就提工单给供应商。响应一般都要大半天(我们公司是有vip,相对大半天能够响应是算好了),虽然有时候有响应,但是会转到其他研发老师,期间可能会是几天!如果是经常开发云星空的二开功能,熟练了速度回很快,但是对于接触不多的,或者刚入门的,会是个漫长的折磨过程。1、重新生产模块的dll.2、退出客户端3、重启iis4、等待五六分钟5、附加到进程6、登录客户端进去操作。 阅读详情

相关推荐

基于单片机的室内空气质量监控系统设计

摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 方案选择 3 1.2 系统控制原理 4 2系统硬件设计 5 2.1 单片机的选择与设计 5 2.2 温湿度模块设计 6 2.3 甲醛采集模块设计 8 2.4 显示器模块设计 9 2.5 按键模块设计 10 2.6 报警模块设计 11 2.7 加湿及风扇模块设计 11 3系统软件设计 13 3.1 总流程方案设计 13 3.2 温湿度获取的软件设计 14 3.3 液晶屏LCD1602的软件设计 15 4系统调试 13 4

Q_1928499906的博客 2698

C++中STL容器总结

STL容器1、容器分类 1、容器分类 STL中通常将容器分为三类:顺序容器、关联容器和容器适配器。 1、顺序容器 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。 顺序容器包括: vector(向量)、list(列表)、deque(队列)...

EricLee23 2362

贴片二极管SOD封装详解:SOD-123/323/523尺寸焊盘设计要点

表面贴装技术中,二极管封装尺寸直接决定PCB布局与焊接可靠性。SOD封装作为小外形二极管的主流形态,其SOD-123、SOD-323、SOD-523三种规格分别对应不同的功耗与占板面积权衡。理解封装尺寸、焊盘设计计算逻辑和钢网开窗原理,是避免立碑、虚焊等工艺缺陷的关键。在可穿戴设备、电源保护等空间受限场景中,合理选择封装不仅能优化散热路径,还能提升量产良率。本文从焊盘计算、工艺要点到选型策略,全面解析SOD封装的工程实践。

weixin_42520780的博客 295

c++STL库容器介绍

黑马程序员C++课程(BV1et411b73Z)笔记

cO_ob的博客 2598

【PADS-开发指南】

馒头破戒大师

sinat_23896491的博客 3213

拓扑优化背后的科学:ANSYS Workbench中的算法与原理

本文深入解析了ANSYS Workbench中拓扑优化的科学原理与算法实现,重点介绍了密度法(SIMP)和灵敏度分析等核心算法。通过分层架构解析和参数调优实战,展示如何有效进行模型验证与多物理场耦合优化,帮助工程师提升结构设计效率与性能。

weixin_29250403的博客 417

【C++】STL 标准模板库 ③ ( STL 容器简介 | STL 容器区别 | STL 容器分类 | 常用的 STL 容器 )

一、STL 容器简介 1、STL 容器区别 2、STL 容器分类 3、常用的 STL 容器

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1667

匈牙利算法解决指派问题清晰流程

匈牙利算法解决指派问题清晰流程 百度词条上,指派问题(Assignment problem)是这么定义的:在满足特定指派要求条件下,使指派方案总体效果最佳。如:有若干项工作需要分配给若干人(或部门)来完成;有若干项合同需要选择若干个投标者来承包:有若干班级需要安排在若干教室里上课等。   一、做减法(归约): 行归约:每行元素减去该行最小元素。 列归约:每行元素减去该行最小元素。

siss0siss的博客 6万+

STL容器详解

文章目录1. 容器的结构与分类2. 序列容器(Sequence Containers)2.1 list 容器2.2 vector 容器2.3 array 容器2.4 deque 容器2.4.1 queue 容器2.4.2 stack 容器3. 关联容器(Associative Container)3.1 set / multiset 容器3.2 map / multimap 容器3.3 unordered 容器 STL的容器可分为序列容器和关联容器两大类。 序列容器:有数组(array)、向量(vect

To the beyond and infinity! 2044

Allegro如何去掉PCB内层未使用的过孔孔环?

在用Allegro进行PCB设计过程中,遇到铺铜铜箔被焊盘大量割断,导致铺铜不完整,这样就会导致铺铜过电流太小,影响板的性能,严重的会导致板工作不稳定,甚至不工作。解决办法:是去掉内层未使用的过孔孔环,增大过铜箔面积。

bhxc809751502的博客 2571

【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)和CA(匀加速),滤波使用EKF。附完整代码

CV模型:状态包含位置、速度和零加速度(9维状态),状态转移矩阵忽略加速度项CA模型:完整包含位置、速度和加速度(9维状态),状态转移矩阵包含二次项过程噪声矩阵Q分别根据两种模型的运动特性推导。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 560

STL容器基础篇

与queue队列不同的是,优先级队列中的元素并不是遵循的先进先出的原则,即先进队列的元素并不一定会先出队列,而是优先级最大的元素先出队列,同时优先级队列每次只能方位priority_queue中位于对头的元素。list由双向链表实现而成,元素存放在堆上,空间是按需分配的,用到一个元素的空间就分配一个元素的空间,通过指针来进行数据的访问,不支持随机存储,但是在插入删除上有很高的效率,只需要O(1)的时间复杂度。set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等,使用的时候需要自己注意。

c_c00000000的博客 2131

【WRF模拟】保存wrf输出文件到指定目录+仅输出指定空间域/变量文件

修改wrf命令以更改指定输出文件目录等

WW、forever的博客 543

十STL容器

  <!-- @page { size: 8.5in 11in; margin: 0.79in } H1 { margin-top: 0.24in; margin-bottom: 0.23in; line-height: 200%; page-break-inside: avoid } H1.western { fo

Dean Chen的专栏 4305

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

STL中容器的理解

这里对应STL容器的总结还不够全面,主要是在我学习过程中遇到的一些知识点进行记录。

山有木兮 1285

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【C++】STL容器

c++ stl容器学习,详细介绍顺序容器、关联容器以及容器适配器等

weixin_40514381的博客 1215

C++STL容器

STL(Standard Template Library)是C++中的标准模板库,提供了很多常用的数据结构和算法。其中,STL容器就是其中的一个重要组成部分,用于存储和组织数据。STL容器包括以下几种主要类型:序列容器(Sequence Containers)、关联容器(Associative Containers)、无序关联容器(Unordered Associative Containers)、容器适配器(Container Adapters)。

xxxiaobai707的博客 1477

STL 容器

STL(标准模板库)是C++的核心组件,包含容器、迭代器和算法三大模块。容器分为序列式、关联式和容器适配器三类。序列式容器(如vector、list、deque、array、forward_list)按元素插入顺序线性排列,支持随机或顺序访问。关联式容器分为有序(基于红黑树,如set、map、multiset、multimap)和无序(基于哈希表,如unordered_set、unordered_map、unordered_multiset)两类,前者按键排序,后者通过哈希函数快速访问。有序关联容器保证元素

m0_47175840的博客 780

C++ STL -1 | STL 容器

C++ STL标准模板库提供了多种容器,可分为顺序容器(vector、deque、list)、关联容器(set、map)和无序容器(unordered_set、unordered_map)。vector适合随机访问和尾部操作,deque支持高效头尾操作,list适合任意位置插入删除。关联容器基于红黑树实现有序存储,无序容器基于哈希表提供高效查找。选择容器时需考虑操作效率、内存布局和具体应用场景。STL容器能显著提升开发效率和代码性能,根据需求合理选择容器是关键。

电子异术博物馆 1290

STL容器分类总结

C++ STL容器分类与应用摘要 STL容器分为四大类:序列容器(vector、deque等)、关联容器(set、map等)、无序关联容器(unordered_set等)和容器适配器(stack、queue等)。序列容器保持插入顺序,关联容器有序存储,无序容器基于哈希表实现快速查找。选择容器需考虑:随机访问选vector/deque;频繁插入/删除选list;有序查找用set/map;快速查找用unordered系列;特定数据结构用适配器。典型应用场景包括:动态数组(vector)、字典(map)、哈希表(

jie18894575860的博客 1016

STL常见容器介绍

STL总结

m0_74194861的博客 1530

STL 容器类型

1. STL有6种序列容器类型  1 vector     向量 相当于一个数组     在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此

和大黄的博客 1万+

C++中STL容器

定长数组,大小在编译时固定,提供类似于 C 风格数组的功能,但具有更多的 STL 接口。元素按哈希值排序的集合,元素不重复,支持常数时间的查找、插入和删除操作。支持在头部和尾部进行高效的插入和删除操作,同时可以随机访问元素。元素按键值排序的集合,元素不重复,支持高效查找、插入和删除操作。双向链表,可以在任意位置高效插入和删除元素,但不支持随机访问。,按哈希值排序,支持常数时间的查找、插入和删除操作。,按键排序,支持高效查找、插入和删除操作。实现,支持按优先级排序的元素插入和访问。类似,但允许重复元素。

qq_68639191的博客 1349
上一篇: STL之list模板
下一篇: STL(map)
nodeadbird520
博客等级 码龄19年 20粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值