几种STL容器的基本用法[资料] 【转贴】

【实战】——零代码玩转Supervisely人像分割:从标注到模型训练的数据流水线搭建 本文详细介绍了如何零代码使用Supervisely平台搭建人像分割数据流水线,从智能标注到数据集格式转换,再到模型训练与优化。Supervisely的智能标注工具和协作功能大幅提升了人像分割项目的效率,特别适合视频会议背景虚化、虚拟试衣等应用场景。 阅读详情

一、原型与构造函数

Vector的原型可定义为

vector<T, allocator <T> >

其构造函数为

vector()             //空的

vector(al)          //指定一种allocator

vector(n)           //用默认T()初始化n个元素

vector(n, val)   //用Val初始化n个元素

vector(n,val,al)         //用val初始化n个元素,用al做分配器

vector(first,last)       //从己有的first到last复制生成

vector(first,last,al)  //从己有的first到last复制生成,用al做分配器

 

二、操作

1.开辟N个空间

vecobj.reserve(N);

2.当前(重新分配内存前)得到最大容量

capacity();

3.重新分配内存为N

resize(N)

如果变小,则删除多余。如果变大,则用T()添充

4.清空

clear();

注意,clear()和resize()都不一定使得vector变小,若欲释放内存,请使用vecobj.swap(vector<T, A>())

5.存取首尾元素

front()与back()操作,取后一个和最前一个元素,注意其返回是引用,其而是左值(l_value),因此可以赋值. 做类似于vecobj.front() = 3;的操作,但要保证front空间有效,否则形为无法预测。

6.取值

[]与at可以做此操作,at会检查,如果越界有会out_of_range的异常被throw

7.push_back, pop_back

要保证不为空

8.使用assign

assign可以改变大小和初值,大小是随意的,不受开始时大小的限制,如果设置为0,则清空。

assign(5,0)把vector改为5个大小,并用0添充

assign(iax+3,iax+5); 从数组第4到5个填充,注意左闭右开,即可取到iax[3]与iax[4]

9.使用insert

insert(it, x),在it前插入一个元素x

insert(it,first,last),在it前插入一个序列[first,last)左闭右开

10.使用erase

erase(it)删除在it处的元素,返回值为下一元素。如果intVec.erase(intVec.end());并不会报错,如果删除一个序列[first,last),使用erase(first,last)

11.BVector是vector<bool>的特化版,具体的用途有待查证

12.flip()把某一元素,求反。如vecObj[i].flip();

13.swap. vecObj.swap(vecObj[i],vecObj[j]);

若要在容器中装一个对象并且能并检索,需要重载operator == ,如下:

#include <vector>

#include <iostream>

#include <stdlib.h>

#include <time.h>

//#include <getopt.h>

using namespace std;

 

class Obj

{

public:

         Obj(int x, int y, int z)

         {

                   this->x = x;

                   this->y = y;

                   this->z = z;

         }

         bool operator == (const Obj & obj)

         {

                   if(obj.x == x && obj.y == y && obj.z == z)

                            return true;

                   return false;

         }

         int getX()

         {

                   return this -> x;

         }

private:

         int x;

         int y;

         int z;

};

 

int main(int argc, char * argv[])

{

         vector<Obj> vecObj;

         Obj obj1(2,3,4);

         Obj obj2(4,5,6);

         vecObj.push_back(obj1);

         vecObj.push_back(obj2);

        

         vector<Obj>::iterator it =find(vecObj.begin(),vecObj.end(),Obj(2,3,4));

         if(it != vecObj.end())

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

         return 0;

}

list的基本用法

与vector的用法基本相同,其中需要强调一点的是splice()函数,是指把指定段的另一个List插入到指定位置的前面。

splice(iterator it , list &x)

splice(iterator it, list &x, iterator first)

splice(iterator it,list &x, iterator first, iterator last)

 

一、原型与构造函数

typdef list<T, allocator<T> >  listObj;

构造函数

list() //空

list(al) //指定allocator的空表

list(n)//n个元素,所有元素都是T()出来的

list(n,val)//n个元素,所有元素都是T(val)出来的

list(n,val,al)//同上,并指定allocator为al

list(first, last) //复制构造

list(first,last,al) //指定allocator构造

二、操作

1.resize & clear

使用resize(n)改变大小,使用resize(n, val)如果需要用T(val) 来填满空闲值。

2.front ()& back()

如果listObj非常量对象,返回是一个左值函数

3.插入操作

insert(iterator it , val)

insert(iterator it, first, last)

insert(iteratot it, n, x)//插入n个x

4.移除

remove(x); //vector.erase(integrator it)

按值删

int iax[] ={3,4,5,6,6,7,8};

         list<int> lObj;

         lObj.insert(lObj.begin(),iax, iax + 7);

         lObj.remove(6); //

按函数条件删

 

#include <iostream>

#include <list>

using namespace std;

// a predicate implemented as a function:

bool single_digit (const int& value) { return (value<10); }

// a predicate implemented as a class:

class is_odd

{

public:

  bool operator() (const int& value) {return (value%2)==1; }

};

int main ()

{

  int myints[]= {15,36,7,17,20,39,4,1};

  list<int> mylist (myints,myints+8);   // 15 36 7 17 20 39 4 1

  mylist.remove_if (single_digit);      // 15 36 17 20 39

  mylist.remove_if (is_odd());          // 36 20

  cout << "mylist contains:";

  for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)

    cout << " " << *it;

  cout << endl;

  return 0;

}

当然,对于class is_odd,也可以写成

template <class T>

class is_odd

{

};

调用时,则要改成

mylist.remove_if(is_odd<int>());

5.unique操作

// list::unique

#include <iostream>
#include <cmath>
#include <list>
using namespace std;
 
// a binary predicate implemented as a function:
bool same_integral_part (double first, double second)
{ return ( int(first)==int(second) ); }
 
// a binary predicate implemented as a class:
class is_near
{
public:
  bool operator() (double first, double second)
  { return (fabs(first-second)<5.0); }
};
 
int main ()
{
  double mydoubles[]={ 12.15,  2.72, 73.0,  12.77,  3.14,
                       12.77, 73.35, 72.25, 15.3,  72.25 };
  list<double> mylist (mydoubles,mydoubles+10);
  //UNIQUE以前必须要Sort,切记,它的内部实现是I,i+1的方式。
  mylist.sort();             //  2.72,  3.14, 12.15, 12.77, 12.77,            
                             // 15.3,  72.25, 72.25, 73.0,  73.35
 
  mylist.unique();           //  2.72,  3.14, 12.15, 12.77
                             // 15.3,  72.25, 73.0,  73.35
 
  mylist.unique (same_integral_part);  //  2.72,  3.14, 12.15
                                       // 15.3,  72.25, 73.0
 
  mylist.unique (is_near());           //  2.72, 12.15, 72.25
 
  cout << "mylist contains:";
  for (list<double>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
    cout << " " << *it;
  cout << endl;
 
  return 0;
}

6.排序操作

sort(); //默认按operator <排序,从小到大

sort(pr); //pr为Functional函数

7.Merge操作

在merge操作前,需要对两个序列都用operator <排序,当然,也可以指定pr排序函数

merge(s2)

merge(s2,pr);

8.reverse()

翻转操作,把整个list翻转

deque的基本操作

一、原型与构造函数

typedef deque<T, allocator<T> > deqObj;

构造函数

deque();

deque(al);

deque(n);

deque(n,x);

deque(n,x,al);

deque(first,last);

deque(first,last,al);

二、操作

1.resize & clear

使用resize(n)改变大小,使用resize(n, val)如果需要用T(val) 来填满空闲值。

2.clear操作

在clear后调用deqObj.swap(deque<T,A>())是好习惯,而且也一定要这么做。

3.font(),back(),operator [],(如出边界,形为未定)at()(如出边界,抛异常),push_back(),push_front(),pop_back(),pop_front(),insert(iterator it,x),insert(iterator it,n,x),insert(iterator first,iterator last),(插入后指向刚插入的值),erase(it),删除在it指定位置的值,erase(iterator first,iterator last)删除指定区间的值(左闭右开)。这些操作与上面的操作雷同。

 

Set与multiset的基本操作

一、原型与构造函数

typedef set<Key, less<Key>, allocator<key> > setObj;

构造函数

set(); //空set,按pred()排序

set(pr); //声明一个空的按pr排序的set

set(pr,al); //声明一个按pr排序的集合用al分配

set(first,last)

set(first,last,pr)

set(first,last,pr,al)

操作

1.clear()

2.erase(it); erase(first, last)

3.insert(key),返回值为pair<iterator, bool> 类型,没有与插入元素相同的元素时,second为true,此时first指向新插入的元素。否则为False,first仍指向原来的元素

4.find(key)

5.lower_bound(key)

6.upper_bound(key)

7.equal_range(key),返回一个pair<iterator , iterator >(lower_bound(key), upper_bound(key))

8.count, equal_range的长度

9.key_comp,如果k1排在k2的前面,那么key_comp()(key1,key2)就为true

10.value_comp,对于set<key>对象,它与key_comp一样。

multiset

1.insert,由于insert总能成功,那么它返回的就是新元素的迭代器,而并非pair<iteraor, bool>对象.

2.find返回第一个与key相等的迭代器。

3.equal_range将返回 [0,setObj.size())的任意长度.

4.count()将返回[0,setObj.size())的任意值。

基于simulink的多能源系统协同控制的复杂场景实例:氢燃料电池+锂电池混合动力电动汽车能量管理仿真 本文介绍了基于Simulink的氢燃料电池与锂电池混合动力电动汽车能量管理系统的建模与仿真方法。系统包含驾驶循环输入、氢燃料电池、锂电池、能量管理和电机驱动等模块,通过Simulink实现各模块的协同控制。文章详细说明了从模型创建到性能评估的完整流程,包括驾驶循环输入设置、燃料电池和锂电池子系统建模、能量管理策略设计等关键步骤。该仿真模型可验证不同工况下的系统响应和能量利用效率,为优化混合动力汽车的能量管理策略提供有效工具。通过引入更复杂的物理细节和环境因素,可进一步提升模型的实用性和准确性。 阅读详情

相关推荐

Chromatix_AEC—深入解析曝光表配置与传感器参数计算

本文深入解析高通Chromatix AEC模块中的曝光表配置与传感器参数计算,详细介绍了自动曝光控制(AEC)的核心概念、首行曝光时间计算、行时间与曝光模式对比、帧率计算逻辑以及曝光表高级配置技巧。通过实战案例展示如何优化传感器参数联调,帮助开发者掌握Chromatix工具在摄像头系统中的关键应用。

266

C++标准库:STL以及输入输出库,IO库,Cmath库,时间库,智能指针库与并发库等简介

c++标准库 STL cmath chrono iostream thread mutex condition_variablecondition_variable

追赶时代的博客 2276

VIO实战前传:手把手教你解读Kalibr双目IMU标定报告与参数应用

本文详细解析Kalibr双目IMU联合标定报告的核心参数与应用方法,涵盖重投影误差分析、IMU误差指标解读、关键变换矩阵原理及VINS-Fusion实战配置。通过手把手教学帮助开发者准确理解标定结果,解决VIO算法落地中的参数配置难题,提升视觉惯性里程计的系统稳定性与精度。

weixin_42699679的博客 331

C++ ——STL(下)

对C++STL容器中的stack容器、queue容器、list容器、set容器、map容器的功能和语法做了简单介绍,并对STL中的函数对象、谓词、内建函数对象的功能和用法做了介绍和举例。本文还以评委打分和员工分组两个案例,分析实现步骤,对STL容器进行具体的运用。

m0_74893211的博客 187

CVE-2017-7921漏洞深度解析:海康设备明文密码泄露原理与七层防御

网络摄像头安全本质上是嵌入式Web服务安全,其核心在于身份认证机制是否健全。CVE-2017-7921并非传统远程执行漏洞,而是因信任错位导致的未授权API暴露——`/Security/users/1`接口绕过Session校验,直接返回admin明文密码。该问题根植于安防设备早期‘物理隔离+前端可控’的设计假设,在P2P、云平台等新场景下全面失效。技术价值在于揭示了轻量级HTTP服务中路径级访问控制缺失的普遍风险;典型应用场景包括ONVIF协议接管、Telnet后门登录及NVR侧横向移动。本文基于DS-2

weixin_33324197的博客 396

AUTOSAR知识点:PDUR(PDU Router)基础知识

通过定义路由表和实现相应的路由和缓冲逻辑,PDUR能够确保PDU在不同ECU之间的可靠传输。在上述示例中,我们定义了一个简单的PDUR路由表,其中列出了源ECU和目标ECU之间的映射关系。当收到来自源ECU的PDU时,PDUR模块会根据路由表查找目标ECU,并将PDU传输到相应的目标ECU。PDUR的主要功能是将接收到的PDU从一个ECU路由到另一个ECU,并确保数据的正确传输。需要注意的是,上述示例是一个简化的实现,实际的PDUR模块可能包含更复杂的功能和逻辑。

EcmFsharp的博客 1156

关于STL——篇2

目录1. map2.setdeque,list,vector对比STL算法 1. map 介绍: 板子: #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> #include<map> #define ll long long using namespace

在人间贩卖声音 514

【滚雪球学数学建模】第1节·建模入门+三步法+案例

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 6409

STL cmath

#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;cmath&gt;#include&lt;stdlib.h&gt;using namespace std;int main(){ cout&lt;&lt;log2(4)&lt;&lt;endl;       cout&lt;&lt;log10(1000)&lt;&lt

SYITwin的博客 445

互联网的发展简史—web

互联网是我现在生活所离不开的一个东西,但是你知道互联网的前世今生吗?本文将讲解互联网的发展史,以及很火的元宇宙概念。

yj11290301的博客 3561

课堂练习及课后作业2.1:外部中断

本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?本关任务:修改版本 0 内核,使得每发生 100 次时钟中断,就在屏幕上输出一个字符‘t’和当时的进程号,如“t(0)”表示0号进程运行时发生了时钟中断。本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?本关任务:修改版本 1 内核源码,使得每次时钟中断发生时,都在屏幕上输出字符‘t’。分析版本1内核,找到第一次时钟中断的恢复点地址。

Junds0的博客 1万+

STL中的find,find_if函数(对类、容器(vector、list)进行查找)

举例using namespace std; int main() { listlst; lst.push_back(10); lst.push_back(20); lst.push_back(30); list::iterator  it = find(lst.begin(), lst.end(), 10); // 查找list中是否有元素“10” if(it != lst.

lianghui0811 1390

MIC:最大信息系数

目录 1. 概念 1.1 MIC 1.2 互信息 2.MIC的优点 3. 算法原理 3.1 MIC公式原理 3.2MIC计算步骤 (1)计算最大互信息值 (2)对最大的互信息值进行归一化 (3)选择不同尺度下互信息的最大值作为MIC值 4. 代码实现 6. 其他方法 1. 概念 1.1 MIC MIC,即(Maximal Information...

满腹的小不甘 5万+

几种STL容器的基本用法[资料]

 几种STL容器的基本用法[资料]一、原型与构造函数Vector的原型可定义为vector > 其构造函数为vector()             //空的vector(al)          //指定一种allocatorvector(n)          //用默认T()初始化n个元素vector(n, val)   //用Val初始化n个元素

JamesXing的专栏 1229

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

常用STL容器的基本用法

系统为某一程序分配空间时,所需时间与空间大小无关,与申请次数有关。

2301_80455281的博客 1439

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++ STL容器(container) 入门总结

STL为用户提供了多种名为容器(Container)的类,用于管理数据集合。 在创建动态数组、表、栈、队列、地图等数据结构时,我们只需定义对应的容器,包含其头文件,然后调用相应成员函数或算法即可。   C++ STL 最为基本的容器(Container)如下所示: stack:栈 queue:队列 vector:向量 list:双向链表 set...

Patience 8105

C++ STL unordered_map容器用法详解

C++ STL 标准库中提供有 4 种无序关联式容器,本节先讲解 unordered_map 容器。unordered_map 容器,直译过来就是"无序 map 容器"的意思。所谓“无序”,指的是 unordered_map 容器不会像 map 容器那样对存储的数据进行排序。换句话说,unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。

weixin_51710308的博客 3449

C++——STL容器

STL容器的介绍 vector, queue, deque, priority_queue, list, map 等等

JAN6055的博客 6030

C++ STL常用容器

C++的STL中,有哪几种容器? 容器 在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。 序列容器(7个) vector vector是一段连续的内存地址,基于数组实现,其提供了自动内存管理功能(采用了STL普遍的内存管理器allocator),可以动态改变对象长度,提供随机访问。在尾部添加和删除元素的时间是常数的,但在头部或中间就是线性时间。 在ve...

a834595603的博客 8734

STL vector的内部实现原理及基本用法

本文基于STL vector源代码,但是不考虑分配器allocator,迭代器iterator,异常处理try/catch等内容,同时对_Ucopy()、 _Umove()、 _Ufill()函数也不会过度分析。一、vector的定义template<class _Ty, class _Ax> class vector : public _Vector_val<_Ty

qinm的专栏 4万+

C++ STL 库教学资料

STL中的4大块面:QUEUE,STACK,TAIR,MAP

YJ2013_7817的博客 911

竞赛常用STL容器详解

在算法竞赛中,使用C++语言的占很大比例,而几乎没有人使用C语言,其中核心的原因就是C++包含STL容器库,能够极大地减少选手在赛场上为了一些基础数据结构而浪费的时间。如果可以的话,我们总是希望不要手写红黑树、动态数组的。那么STL容器库的出现就像雪中送炭一样了。它们覆盖了竞赛中最基础的需要(张昆玮树、主席树这种东西肯定不会包含的),让你在面对非数据结构题的时候能够不因数据结构部分的代码而分心。 关于STL容器的相关问题非常细,经常成为面试中的考题,这里我们仅讨论一些必须的内容,然后只谈论在竞赛中的具体使用

zclll的博客 1475

C++STL容器

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

xxxiaobai707的博客 1477
上一篇: 对包含Struct的Vector就其中的一种属性排序 [转贴]
下一篇: reinterpret_cast const_cast dynamic_cast static_cast 区别使用【zhuan】
发现心流
博客等级 码龄20年 52粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值