C++中的各种容器的使用方法
admin
2024-05-09 08:21:31
0

vector

vector是封装动态数组的顺序容器。元素相继存储,这意味着不仅可通过迭代器,还能用指向元素的常规指针访问元素。这意味着指向 vector 元素的指针能传递给任何期待指向数组元素的指针的函数。

构造函数

//空的vector容器
vectorv1;
//size为5,值的初始化为0的vector容器
vectorv2(5);
//size为5,值的初始化为1的vector容器
vectorv3(5, 1);
//创建vector时就初始化
vectorv4 = { 1,3,4,5,7 };
//利用别的vector创建初始化vector
vectorv5(v4);
//指定起始与结束内容创建与初始化
vectorv6(v4.begin()+3, v4.end());

迭代器iterator

begin() 返回第一个元素的迭代器 
end() 返回最末元素的迭代器 
rbegin() 返回Vector尾部的逆迭代器 
rend() 返回Vector起始的逆迭代器 

访问元素

v.at(i)	//返回vector v指定位置的元素
v[i]	//返回vector v指定位置的元素
v.back() //返回最末一个元素 
v.front() //返回第一个元素 

插入与删除元素

void push_back( const TYPE &val ); //在Vector最后添加一个元素 
void pop_back(); //移除最后一个元素 
iterator erase( iterator loc );	//删除指定loc元素
iterator erase( iterator start, iterator end );	//删除[start,end)元素v.push_back(3);	//vector最后添加元素3
v.pop_back();	//删除vector最后一个元素
v.erase(v.begin());//删除位置为begin的元素
v.erase(v.begin(),v.end());//删除区间[begin(),end())的元素

insert函数

//在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器, 
iterator insert( iterator loc, const TYPE &val );
//在指定位置loc前插入num个值为val的元素 
void insert( iterator loc, size_type num, const TYPE &val );
//在指定位置loc前插入区间[start, end)的所有元素
void insert( iterator loc, input_iterator start, input_iterator end );v.insert(v.begin(),1);//在begin()位置插入元素1
v.insert(v.begin(),5,1);//在begin()位置插入5个值为1的元素
v.insert(v.begin(),v1.begin(),v1.end());//在begin()位置插入区间[v1.begin(),v1.end())的元素

deque

是有下标顺序容器,它允许在其首尾两段快速插入及删除。另外,在 deque 任一端插入或删除不会非法化指向其余元素的指针或引用。

构造函数

//无参,创建一个空双向队列 
deque();
//size - 创建一个大小为size的双向队列 
deque( size_type size );
//num and val - 放置num个val的拷贝到队列中 
deque( size_type num, const TYPE &val );
//from - 从from创建一个内容一样的双向队列 
deque( const deque &from );
//start 和 end - 创建一个队列,保存从start到end的元素
deque( input_iterator start, input_iterator end );dequed1;//空双向队列
dequed2(5);//大小为5,值为0的双向队列
dequed3(5,1);//大小为5,值为1的双向队列
dequed4(d3);//创建一个与d3相同的双向队列
dequed5(d3.begin(),d3.end());
dequed6 = {1,4,6,8};//初始化队列

迭代器iterator

begin() 返回第一个元素的迭代器 
end() 返回最末元素的迭代器 
rbegin() 返回尾部的逆迭代器 
rend() 返回起始的逆迭代器 

访问元素

d.at(i)	//返回指定位置的元素
d[i]	//返回指定位置的元素
d.back() //返回最末一个元素 
d.front() //返回第一个元素 

插入与删除元素

void push_back( const TYPE &val ); //在最后添加一个元素 
void pop_back(); //移除最后一个元素 
void push_front( const TYPE &val ); //在头部加入一个元素 
void pop_front(); //删除头部的元素 
iterator erase( iterator loc );	//删除指定loc元素
iterator erase( iterator start, iterator end );	//删除[start,end)元素
iterator emplace( const_iterator pos, Args&&... args );d.push_back(3);	//最后添加元素3
d.pop_back();	//删除最后一个元素
d.push_front(1)	//首元素添加元素1
d.pop_front();	//删除首元素
d.erase(d.begin());//删除位置为begin的元素
d.erase(d.begin(),d.end());//删除区间[begin(),end())的元素

insert函数

//在位置为pos插入元素val
iterator insert( iterator pos, const TYPE &val );
//在位置为pos插入num个值为val元素
iterator insert( iterator pos, size_type num, const TYPE &val );
//在位置pos插入区间[start,end)
void insert( iterator pos, input_iterator start, input_iterator end );//在begin位置插入元素1
d.insert(d.begin(),1);
//在begin位置插入5个值为1的元素
d.insert(d.begin(),5,1);
//在begin插入区间[d2.begin(),d2.end())
d.insert(d.begin(),d2.begin(),d2.end());

queue

queue 是STL提供的队列容器

TYPE &back(); //返回最后一个元素 
bool empty();	//如果队列空则返回真 
TYPE &front() 返回第一个元素 
TYPE &pop() 删除第一个元素 
void push( const TYPE &val );在末尾加入一个元素 

功能就和普通的队列相同

Priority Queues(优先队列)

优先队列类似队列,但是在这个数据结构中的元素按照一定的断言排列有序

priority_queue
priority_queue    
其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 这里保存的容器一般用vector和dequepriority_queue q;	//排序顺序默认为降序,也就是创建了大顶堆
priority_queue,less> q;	//排序顺序为升序,创建了小顶堆

优先级队列,这个容器可以用set来实现。

stact

该容器与现实数据结构stack相同

bool empty() 	//堆栈为空则返回真 
void pop(); 	//移除栈顶元素 
void push( const TYPE &val ); //在栈顶增加元素 
size_type size(); 	//返回栈中元素数目 
TYPE &top(); 	//返回栈顶元素 

list

List将元素按顺序储存在链表中. 与 vector相比, 它允许快速的插入和删除,但是随机访问却比较慢

构造函数

list lst; //list采用模板类实现对象的默认构造形式:
list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。
list(n,elem); //构造函数将n个elem拷贝给本身。
list(const list &lst); //拷贝构造函数。listL;	//空的list容器
listL2(5);//大小为5值为0的容器
listL3(5,1);//大小为5值为1的容器
listL4(L3);//用L3创建容器
listL5 = {1,4,6,8,4};//初始化容器

迭代器iterator

iterator begin();	//返回指向第一个元素的迭代器
iterator end()		//返回末尾的迭代器
iterator rbegin()	//返回指向第一个元素的逆向迭代器
iterator rend()		//返回list末尾的逆向迭代器

访问元素

L.back() //返回最末一个元素 
L.front() //返回第一个元素 

插入与删除元素

void push_back( const TYPE &val ); //在最后添加一个元素 
void pop_back(); //移除最后一个元素 
void push_front( const TYPE &val ); //在头部加入一个元素 
void pop_front(); //删除头部的元素 
iterator erase( iterator loc );	//删除指定loc元素
iterator erase( iterator start, iterator end );	//删除[start,end)元素
void remove( const TYPE &val );	//删除所有的指定元素
void remove_if( UnPred pr );//以一元谓词pr为判断元素的依据,遍历整个链表。如果pr返回true则删除该元素L.push_back(3);	//最后添加元素3
L.pop_back();	//删除最后一个元素
L.push_front(1)	//首元素添加元素1
L.pop_front();	//删除首元素
L.erase(d.begin());//删除位置为begin的元素
L.erase(d.begin(),d.end());//删除区间[begin(),end())的元素
L.remove(1);	//删除元素1
L.remove_if([](int n) { return n > 4; });	//删除大于4的元素

insert函数

//在位置为pos插入元素val
iterator insert( iterator pos, const TYPE &val );
//在位置为pos插入num个值为val元素
iterator insert( iterator pos, size_type num, const TYPE &val );
//在位置pos插入区间[start,end)
void insert( iterator pos, input_iterator start, input_iterator end );//在begin位置插入元素1
L.insert(L.begin(),1);
//在begin位置插入5个值为1的元素
L.insert(L.begin(),5,1);
//在begin插入区间[L2.begin(),L2.end())
L.insert(L.begin(),L2.begin(),L2.end());

合并链表

merge()合并两个list,要求两个list必须有序;
splice()不需要list有序,splice()不复制或移动元素,仅重指向链表结点的内部指针
可以用advance调整iterator 的位置

void merge( list &lst );	//合并两个list必须有序,默认是升序,被合并list会被清空
void merge( list &lst, Comp compfunction );	//合并两个list,按照指定的顺序排序
void splice( iterator pos, list &lst );	//将lst指向pos位置
void splice( iterator pos, list &lst, iterator del );	//将lst中del指向pos
void splice( iterator pos, list &lst, iterator start, iterator end );//将lst区间start与end元素指向posL.merge(L2);	//将L2合并到L
L.merge(L2,Compare);	//将L2合并到L,指定Compare规则
L.splie(L.begin(),L2);	//将L2整个list指向L.begin()位置
L.splie(L.begin(),L2,L2.begin());	//从L2的迭代器L2.begin()开始指向L.begin()位置
L.splie(L.begin(),L2,L2.begin(),L2.end());	//将L2的迭代器区间[L2.begin(),L2.end())指向L的迭代器L.begin()位置

set

set容器的底层是由二叉树构成。set在插入元素时,是不允许插入重复元素的;multiset是允许插入重复元素的。set会自动排序,默认是升序。

构造函数

set中不存在set s(size_type num,T val)。因为set不允许重复元素。

set s; //采用模板类实现对象的默认构造形式:
sets(const set& se); //拷贝函数,将s初始化为se一样
sets(iterator start,iterator end)	//将s的初始化为[start,end)区间sets1;
sets2(s);
sets3(s.begin(),s.end());
sets4 = {1,2,3,4};

可以使用set指定排序规则。

迭代器iterator

iterator begin();	//返回指向第一个元素的迭代器
iterator end()		//返回末尾的迭代器
iterator rbegin()	//返回指向第一个元素的逆向迭代器
iterator rend()		//返回末尾的逆向迭代器
iterator lower_bound()	//返回指向大于(或等于)某值的第一个元素的迭代器
iterator upper_bound()	//返回大于某个值元素的迭代器

插入与删除元素

insert(); //在集合中插入元素
void erase( iterator i );	//删除i的元素
void erase( iterator start, iterator end );		//删除区间[start,end)中的元素
size_type erase( const key_type &key );		//删除指定元素值s.insert(10);	//向s中插入元素10
s.erase(s.begin());	//删除元素为begin()中的元素
s.erase(s.begin(),s.end());	//删除区间[begin,end)的元素
s.erase(1);		//删除值为1的元素

unordered_set

unordered_set 容器,为“无序 set 容器”。即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会

	unordered_sets;s.insert(10);s.insert(60);s.insert(30);s.insert(90);for (auto a : s) {cout << a<< endl;}
--------------------------
90
10
60
30

map

map 是有序键值对容器,默认是升序,它的元素的键是唯一的。用比较函数 Compare 排序键。 map 通常实现为红黑树。mutlimap是允许存储重复元素。

构造函数

set中不存在map s(size_type num,T val)。因为set不允许重复元素。

mapm; //采用模板类实现对象的默认构造形式:
mapm(const map& ml); //拷贝函数,将s初始化为se一样
mapm(iterator start,iterator end)	//将s的初始化为[start,end)区间mapm1;
mapm2(m);
mapm3(m.begin(),m.end());

可以使用map指定排序规则。

迭代器iterator

iterator begin();	//返回指向第一个元素的迭代器
iterator end()		//返回末尾的迭代器
iterator rbegin()	//返回指向第一个元素的逆向迭代器
iterator rend()		//返回末尾的逆向迭代器
iterator lower_bound()	//返回指向大于(或等于)某值的第一个元素的迭代器
iterator upper_bound()	//返回大于某个值元素的迭代器

插入与删除元素

iterator insert(const pair &p); //在集合中插入元素
void insert( input_iterator start, input_iterator end );//插入区间[start,end)元素void erase( iterator i );	//删除i的元素
void erase( iterator start, iterator end );		//删除区间[start,end)中的元素
size_type erase( const key_type &key );		//删除指定元素值m.insert(make_pair(1,10));	//插入pair(1,10)
m.insert(s2.begin(),s2,end());	//插入区间[begin,end)元素m.erase(m.begin());	//删除元素为begin()中的元素
m.erase(m.begin(),m.end());	//删除区间[begin,end)的元素
m.erase(1);		//删除key为1的pair

find()与count()

//返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器
iterator find( const KEY_TYPE &key );
//还回map中键值等于key的元素的个数。map只会返回0、1,mutlimap会返回值的个数
size_type count( const KEY_TYPE &key );map::iterator it=m.find(10) //在m中查找key为10的元素
int num=m.count(10);	//查找key为10的值

unordered_map

unordered_map与map的用法基本一直,最大的区别在于:
map的key是有序的,而unordered_map的key为无序。

#include
int main() {unordered_mapm;m.insert(make_pair(1, 10));m.insert(make_pair(1, 20));//key相同是不会重复存储的m.insert(make_pair(6, 20));m.insert(make_pair(3, 30));m.insert(make_pair(9, 50));for (auto a : m) {cout << a.first << endl;}return 0;
}
-----------------------------
9
1
6
3

unordered_map与unordered_set的存储时按照散列表存储的,输出顺序与输入顺序是不一定相同的

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...