一、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. 浅谈JS函数节流及应用场景

    说完防抖,下面我们讲讲节流,规矩就不说了,先上代码: <!DOCTYPE html> <html lang="en"> <head> <m ...

  2. qtdomdocument找不到

  3. HTML页面导入模板页面(Tomcat)

    找了个前端模板,多个HTML中有重复的部分,一改都改,所以对其进行重构,将重复的部分拿出来 看了很多方法,最简单的是jQuery,但是在我这没起作用,后来发现一个配置tomcat的ssi,让服务器帮我 ...

  4. Codeforces Round #594 (Div. 2) A. Integer Points 水题

    A. Integer Points DLS and JLS are bored with a Math lesson. In order to entertain themselves, DLS to ...

  5. 使用rsync基于ssh免密登陆进行备份或目录同步

    日常工作中有很多的备份工作,rsync是一个很不错的工具,尝试使用基于ssh免密登陆的方式进行备份,测试成功,是可行且方便的方法,撰文记之,以备后用: 1.A主机root用户对B主机root用户做ss ...

  6. body标签添加ontouchstart属性

    之前看别人的代码,发现他的body标签添加ontouchstart属性.即 <body ontouchstart> 上网查了一下原因,记录一下: 这个操作是进行手机端兼容处理的,防止伪类: ...

  7. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 6

    18.5.3  PDO的错误处理模式 PDO共提供了3种不同的错误处理模式,不仅可以满足不同风格的编程,也可以调整扩展处理错误的方式. 1.PDO::ERRMODE_SILENT 这是默认模式,在错误 ...

  8. 明解C语言 入门篇 第八章答案

    练习8-1 #include<stdio.h> #define diff(x,y)(x-y) int main() { int x; int y; printf("x=" ...

  9. 【转载】修改Windows下键盘按键对应功能的一些方案

    原文见:https://sites.google.com/site/xiangyangsite/home/technical-tips/windows-tips/multi_media_key_cus ...

  10. ajax运行原理

    Ajax应用程序的加载过程与传统的Web应用程序类似.某个用户操作引发浏览器的一次HTTP请求.服务器接收请求并处理这个请求,生成合适的执行结果发送至客户端.客户端浏览器经过处理将数据(HTML+CS ...