一、map

1.map简介

map是一种关联式容器,一对一的映射

  • 第一个是key,是唯一的。
  • 第二个是value,关键字所对应的值。

因为map的底层实现是红黑树,所以map会对插入的数据进行排序。

2.插入元素

采用insert直接下标访问两种方式,同时可以看到输出是按照key值排序。

#include"map"
int main() {
map<int,string> um;
um.insert(pair<int,string>(,"steve"));
um[]="antonio"; //访问方式,可以看到插入的元素最后会按照key值排序
for (auto item:um) {
cout<<item.first<<" "<<item.second<<endl;
}
//1 antonio
//2 steve
return ;
}

3.查找元素

查找key出现的位置,如果没有在map中,则返回end(指向尾部的迭代器)

#include"map"
int main() {
map<int,string> um;
um.insert(pair<int,string>(,"steve"));
um[]="antonio"; if(um.find()!=um.end())
cout<<"have found"<<endl;
else
cout<<"not found"<<endl;
return ;
}

4.map常用成员方法

begin() 返回指向map头部的迭代器

end() 返回指向map末尾的迭代器

rbegin() 返回一个指向map尾部的逆向迭代器

rend() 返回一个指向map头部的逆向迭代器

clear() 删除所有元素

count() 返回指定元素出现的次数

empty() 如果map为空则返回true

erase() 删除一个元素

find() 查找一个元素

insert() 插入元素

lower_bound() 返回键值>=给定元素的第一个位置

size() 返回map中元素的个数

5.map和unordered_map比较

在数据量小的时候,unordered_map比map慢

原因在于unordered_map的初始化比较耗时,我们都知道map是红黑树,unordered_map是哈希表,造成性能差异的原因在于,红黑树初始化时,节点只需要一个,后续的插入只是插入新的节点,但是哈希表初始化时就不是那么简单了,哈希表初始化时需要申请一个数组,数组的每个元素都指向一条链表,所以初始化时需要申请很多内存,相比于map,的确更耗时。

二、set

1.set简介

set只保存一个元素,就是key。

set底层实现同样是红黑树,故而内部数据是会排序好。

2.set的插入和遍历

采用insert方法插入。

#include"set"
int main() {
set<int> us;
us.insert();
us.insert();
us.insert(); //1 2 3
for (auto item:us) {
cout<<item<<" ";
}
return ;
}

3.set常用成员方法

begin()        返回set容器的第一个元素

end()      返回set容器的最后一个元素

rbegin()     返回的值和end()相同

rend()     返回的值和rbegin()相同

clear()          删除set容器中的所有的元素

empty()     判断set容器是否为空

size()      返回当前set容器中的元素个数

三、 unordered_map

1.简介

unordered_map是一种关联式容器,一对一的映射

  • 第一个是key,是唯一的。
  • 第二个是value,关键字所对应的值。

底层实现是hash表,故而其内的元素是无序的。

其中hash是使用的拉链法解决冲突。如下图所示

2.元素初始化

插入有常用的两种方式,赋值常用量两种方式。

#include"unordered_map"
#include "iostream"
using namespace std;
//对unordered_map<int,string>使用别名int_string
typedef unordered_map<int,string> int_string;
int main() {
//初始化的几种方法
int_string one={{,"bash"},{,"java"}};
one[]="python";//直接下标插入元素
one.insert(pair<int,string>(,"c++"));//使用成员方法insert插入元素 int_string two ( one ); // 用数组初始
int_string three ( two.begin(),two.end()); // 范围初始化 //访问方式
for (auto item:three) {
cout<<item.first<<" "<<item.second<<endl;
}
return ;
}

3.常用成员方法

begin()    指向第一个元素
end()       指向最后一个元素的迭代器
empty()   判别是否为空
size()      所有键值对的数量
insert()    插入一对元素
erase()    删除指定的键值对
find()       查找元素,如果存在返回的是key值对应的迭代器,如果不存在返回的是end()

四、 unordered_set

1.简介

只保存关键词key

底层实现是hash表,故而其内的元素是无序的。

2.数据初始化

#include"iostream"
#include"unordered_set"
using namespace std;
typedef unordered_set<int> US;
int main() {
US us;
us.insert();
us.insert();
US one(us);//one=us;是等价的
US two(one.begin(),one.end()); //访问方式
for (auto item:two) {
cout<<item<<endl;
}
return ;
}

五、vector

1.简介

vector是序列式容器,按照下表访问。

2.数据初始化

含有一维数组和二维数组的初始化

#include"vector"
using namespace std;
typedef vector<int> Vector;
int main() {
Vector vec(,);
Vector vec1(vec); //Vector vec1=vec这两种方式是等价的
Vector vec2(vec.begin(),vec.end());
Vector vec3={,,,};
Vector vec4();//初始化数组的大小是10,value是0
Vector vec5(,);//初始化数组的大小是10,value是1
//二维矩阵的初始化
vector<vector<int>> ans(,vector<int>(,));
vector<vector<int>> ans1(ans);
return ;
}

3.常用成员方法

begin()        指向第一个元素的迭代器
end()           指向最后一个元素的下一个位置的迭代器
empty()       判别是否为空
size()          存储的数据量
insert()        插入元素
push_back()    在尾部插入元素
pop_back()      将尾部元素弹出

#include"iostream"
#include"vector"
using namespace std;
typedef vector<int> Vector;
int main() {
Vector vec;
vec.push_back();//push元素到末尾
vec.push_back();
vec.push_back();
vec.insert(vec.begin()+,-); //1 -1 2 3
for (int i = ; i < vec.size(); ++i) {
cout<<vec[i]<<" ";
}
vec.pop_back();//将元素弹出
//1 -1 2
for (int i = ; i < vec.size(); ++i) {
cout<<vec[i]<<" ";
}
return ;
}

STL ——map、set、unordered_map、unordered_set的更多相关文章

  1. [STL] map,multimap,unordered_map基本用法

    map的特性是,所有元素都会根据元素的键值自动被排序.map的所有元素都是pair,同时拥有键值(key)和实值(value).pair的第一元素被视为键值,第二元素被视为实值.map不允许两个元素拥 ...

  2. STL之map与pair与unordered_map常用函数详解

    STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...

  3. stl vector、红黑树、set、multiset、map、multimap、迭代器失效、哈希表(hash_table)、hashset、hashmap、unordered_map、list

    stl:即标准模板库,该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法 六大组件: 容器.迭代器.算法.仿函数.空间配置器.迭代适配器 迭代器:迭代器(iterator)是一种抽象的设计 ...

  4. std::map的操作:插入、修改、删除和遍历

    using namespace std; std::map<int,int> m_map; 1.添加 for(int i=0;i<10;i++) { m_map.insert(mak ...

  5. python_08 函数式编程、高阶函数、map、filter、reduce函数、内置函数

    函数式编程 编程方法论: 1.面向过程 找到解决问题的入口,按照一个固定的流程去模拟解决问题的流程 (1).搜索目标,用户输入(配偶要求),按照要求到数据结构内检索合适的任务 (2)表白,表白成功进入 ...

  6. list源码2(参考STL源码--侯捷):constructor、push_back、insert

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  7. vector源码3(参考STL源码--侯捷):pop_back、erase、clear、insert

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷):空间分配.push_back vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 v ...

  8. vector源码2(参考STL源码--侯捷):空间分配、push_back

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...

  9. 学习Road map Part 04 自动驾驶、SLAM、ROS、树莓派

    学习Road map Part 04 自动驾驶.SLAM.ROS.树莓派

  10. CNN中feature map、卷积核、卷积核的个数、filter、channel的概念解释

    CNN中feature map.卷积核.卷积核的个数.filter.channel的概念解释 参考链接: https://blog.csdn.net/xys430381_1/article/detai ...

随机推荐

  1. May 19th, 2019. Week 21st, Sunday

    Fight for what matters to you. 为自己珍视的东西奋斗吧! We all want to make our life goals true, and we all expe ...

  2. layUI学习第三日:layUI模块化开发

    layui 定义为「经典模块化」,具备早前 AMD 的影子,又并非受限于 CommonJS 的那些条条框框, BootStrap 的不同在于:layui 糅合了自身对经典模块化的理解. 除了 layu ...

  3. <Design> 359 346

    359. Logger Rate Limiter 用map搭建. class Logger { HashMap<String, Integer> map; /** Initialize y ...

  4. 关于group by的用法 原理

    转载: https://blog.csdn.net/u014717572/article/details/80687042. 写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉grou ...

  5. oracle--共享磁盘挂载

    01,查看挂载的磁盘 [root@SHLPDBWX01 ~]# fdisk -l Disk /dev/sda: bytes heads, sectors/track, cylinders Units ...

  6. python-11-字典的增删改查

    前言 1.dict 字典:{key,vlaue} --key 必须是不可变数据类型,可哈希,--value:任意数据类型 2.dict优点:二分查找去查询--存储大量的关系型数据,可哈希.--无序的, ...

  7. Sql 代码规范说明

    对于程序工作者来说,代码的阅读必不可少,好的代码让人读起来一目了然.神清气爽,做代码调试也可以很开的捋顺逻辑定位问题,但是如果遇到一些可读性较差,毫无规矩可言的代码,那真的比吃了翔都难受啊,如果再让你 ...

  8. Fusionstorage的逻辑架构

    Fusionstorage Fusionstorage的逻辑架构 Mdc:元数据控制,实现对分布式集群的状态控制,以及控制数据分布式规则,数据重建规则等,mdc默认部署在3个节点的zk盘上,形成mdc ...

  9. MapReduce Shuffle 和 Spark Shuffle 原理概述

    Shuffle简介 Shuffle的本意是洗牌.混洗的意思,把一组有规则的数据尽量打乱成无规则的数据.而在MapReduce中,Shuffle更像是洗牌的逆过程,指的是将map端的无规则输出按指定的规 ...

  10. java高并发系列 - 第3天:有关并行的两个重要定律

    有关为什么要使用并行程序的问题前面已经进行了简单的探讨.总的来说,最重要的应该是处于两个目的. 第一,为了获得更好的性能: 第二,由于业务模型的需要,确实需要多个执行实体. 在这里,我将更加关注第一种 ...