专栏首页CSDN旧文STL常用对象,不会搞得C++跟没学一样

STL常用对象,不会搞得C++跟没学一样

一、map/multimap

map/multimap映射容器的元素数据是由一个Key和一个Value成的,key与映照value之间具有一一映照的关系。 map/multimap容器的数据结构也采用红黑树来实现的,map插入元素的键值不允许重复,类似multiset,multimap的key可以重复。比较函数只对元素的key进行比较,元素的各项数据只能通过key检索出来。虽然map与set采用的都是红黑树的结构,但跟set的区别主要是set的一个键值和一个映射数据相等,Key=Value。

map<first,second> a;
//map,会按照first(键值)排序(查找也是);

map/multimap用法 头文件

#include< map >

map成员函数

begin()				 //返回指向 map 头部的迭代器
clear()			// 删除所有元素
count() 			//返回指定元素出现的次数
empty()				// 如果 map 为空则返回 true
end() 				//返回指向 map 末尾的迭代器
erase()				// 删除一个元素
find()				// 查找一个元素
insert()			 //插入元素
key_comp() 			//返回比较元素 key 的函数
lower_bound() 		//返回键值>=给定元素的第一个位置
max_size() 			//返回可以容纳的最大元素个数
rbegin() 			//返回一个指向 map 尾部的逆向迭代器
rend() 				//返回一个指向 map 头部的逆向迭代器
size() 				//返回 map 中元素的个数
swap()				 //交换两个 map
upper_bound()		 //返回键值>给定元素的第一个位置
value_comp() 		//返回比较元素 value 的函数

创建map对象

#include<iostream>
#include<map>
using namespace std;
map<int,char>mp;//定义map容器 

创建结构体map对象

struct student{
int birth;
string name;
};
int id;
typedef map<int,student> Student;// 这里相当于给map<int,student> 起了个别名Student,后续代码均可以用student代替map<int,student> 使用。

插入结构体对象 接上文代码

Stduent  a; 
cin>>id>>student.birth>>student.name;
a.insert(make_pair(id,student));

通过map容器使得上述解题方式更简便。

二、栈(stack)

1.定义: 栈是一种只能在某一端插入和删除数据的特殊线性表。他按照先进先出的原则存储数据,先进的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后被压入栈的,最先弹出)。因此栈也称先进后出表。 允许进行插入删除操作的一端称为栈顶,另一端称为栈底。栈底固定,栈顶浮动。插入元素称为进栈,删除一个元素称为进栈,栈内元素为零称为空栈。 2.stack成员函数

bool empty ( ) ————>栈为空返回true,否则返回false;
void pop ( ) ————>删除栈顶元素,出栈;
void push(const TYPE&value)————> 插入新元素value,放置在栈顶进栈;TYPE:类型int,char…;
size_type size ( ) ————> 返回堆栈中元素个数;(注意注意!!!!切不可赋值给int ,很容易超过int的范围
TYPE&top()————> 查看当前栈顶元素;

三、向量(vector)

它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。 使用vector需要注意以下几点: 1、当vector、string大量插入数据后,即使删除了大量数据(或者全部都删除,即clear) 并没有改变容器的容量(capacity),所以仍然会占用着内存。 为了避免这种情况,我们应该想办法改变容器的容量使之尽可能小的符合当前 数据所需(shrink to fit)。

vector<type> vec={1,2,3,4.......................};
vector<type>(v).swap(v);
//此时v的容量已经尽可能的符合其当前包含的元素数量
//对于string则可能像下面这样
string(s).swap(s);




  //  即执行交换后,临时变量会被销毁,内存得到释放。

(1)头文件

   #include<vector>

(2)创建vector对象,vector< int > vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;

(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(7)删除元素:

vector.erase(vec.begin()+2);删除第3个元素
   vector.erase(vec.begin()+i,vec.end()+j);删除区间[i,j);区间从0开始

(8)向量大小:vector.size();

(9)清空:vec.clear();

ps: resize(),设置大小(size); reserve(),设置容量(capacity); size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。 打个比方:买了一个新房子,新房子里可以放3张床reserve(3),这是说房子的容量是最多放3张床,但是屋里并不是有三张床,二resize(3),房里安装了3张床,此时房里的床可以使用了。 reserve为容器预留足够的空间,避免不必要的重复分配,分配空间大于等于函数的参数,影响capacity。 resize调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉。若尺寸变大,不够的数据用该函数第二个参数填充,影响size。 由于vector是顺序容器,在内存中分配了一块连续的存储空间。为了保证动态添加元素的高效率,因此必须预先为vector分配一段空间,这个空间就是capacity。 而容器中元素的个数就是size(),在容器中,capacity总是大于等于 size;

四、队列

queue是队列容器,是一种“先进先出”的容器。 头文件

#include <queue>  

queue对象的默认构造形式:queue name; 如:

queue<int> name;            //一个存放int的queue容器。

queue<float> name;     //一个存放float的queue容器。

queue<string> name;     //一个存放string的queue容器。	    

//尖括号内还可以设置指针类型或自定义类型。

queue的成员函数

queue.push(elem);   //往队尾添加元素

queue.pop();   //从队头移除第一个元素

queue(const queue &que);	     //拷贝构造函数

queue& operator=(const queue &que);	//重载等号操作符

queue.back();   //返回最后一个元素

queue.front();   //返回第一个元素

queue.empty();   //判断队列是否为空

queue.size();      //返回队列的大小

五、set集合

set/multiset 与map类的区别是set 的key=value。其余跟map类的可以类比。set容器因为key等于value所以按照值排序,由小到大。 set的各成员函数列表如下:

set.begin()--返回指向第一个元素的迭代器
 set.clear()--清除所有元素
set.count()--返回某个值元素的个数
set.empty()--如果集合为空,返回true
set.end()--返回指向最后一个元素的迭代器
set.equal_range()--返回集合中与给定值相等的上下限的两个迭代器
set.erase()--删除集合中的元素
set.find()--返回一个指向被查找到元素的迭代器
set.get_allocator()--返回集合的分配器
set.insert()--在集合中插入元素
set.lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
set.key_comp()--返回一个用于元素间值比较的函数
set.max_size()--返回集合能容纳的元素的最大限值
set.rbegin()--返回指向集合中最后一个元素的反向迭代器
set.rend()--返回指向集合中第一个元素的反向迭代器
set.size()--集合中元素的数目
set.swap()--交换两个集合变量
set.upper_bound()--返回大于某个值元素的迭代器
set.value_comp()--返回一个用于比较元素间的值的函数

set由大到小排序set<int,greater < int > > M;

七、迭代器

vector< int >::iterator name
容器类型< type> ::iterator name

是一类类似指针的,与指针的区别,map set成员的迭代器不能加减一个整数,只能自增或自减运算。但是vector的可以。 双向迭代器(map multimap set multiset) 组合正向迭代器和逆向迭代器的功能,支持多遍算法 随机访问迭代器(vector deque) 组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素。即可以加减一个常数。

小白创作,还亲各位大佬指点,万分感谢!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 『数据库』数据库编程(概念性的东西,应用一般,甚至有点过时,用来考试)

    为了区分SQL语句与主语言语句,所有SQL语句必须加前缀EXEC SQL, 主语言为C语言时,语句格式:

    风骨散人Chiam
  • 疯子的算法总结(三) STL Ⅱ迭代器(iterator) + 容器

    背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间费连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历。 定义:迭代器是一种检查...

    风骨散人Chiam
  • 『安卓』安卓开发基础--基本控件

    显示文字,相当于Panel。一般用来文本展示,继承自android.view.View,在android.widget包中。

    风骨散人Chiam
  • 那些年在win下填过的Django坑

    專 欄 ❈ JacobYRJ,Python中文社区专栏作者 Python语言爱好者,目前在做Django项目。 Github博客:https://JacobY...

    Python中文社区
  • Python之re模块

    re模块 在Python中想要使用正则表达式,就需要调用re模块来实现。 在 re 模块下的常用方法: 调用时程序最上面需要写 import re 常用的几个关...

    新人小试
  • 使用Oracle SqlDeveloper遇到的2个常见Java错误及解决办法

    用了好长时间的Oracle官方SQL Developer近期在我两位同事的电脑上运行不正常了,起初怀疑是xp系统升级了赛门铁克的杀毒软件造成的,因为我的Win7...

    崔文远TroyCui
  • cs230 深度学习 Lecture 2 编程作业: Logistic Regression with a Neural Network mindset

    杨熹
  • HTML标签嵌套规则

    HTML5学堂:HTML标签存在一定的嵌套规则,如果我们不遵循这个嵌套规则进行代码书写,也能够实现出基本的功能(这大概也是HTML+CSS的特殊之处吧),但是直...

    HTML5学堂
  • 深入浅出Logistic Regression之二分类

    ---- 概述 在深度学习笔记-神经网络基础文章里面介绍过Logistic Regression模型进行二分类和推导。比如:我们现在有一张彩色图片让计算机自己识...

    BrianLv
  • Counting Bloom Filter 的原理和实现

    木东居士

扫码关注云+社区

领取腾讯云代金券