深入学习c++--容器
1. 简介
1. 序列式容器: array, vector, deque, list, forward_list --- 数组 或者 指针实现
2. 关联容器: set, map, multiset, multimap --- 二叉树 红黑树 O(logn)
3. 无顺序容器: unordered_map, unordered_set, unordered_multimap, unordered_multiset
补充拓展:
4. stack
5. queue
6. priority_queue
7. string
8. bitset: (0或1)
2. 元素要求
1. 元素必须 可以被赋值操作来复制或者搬移(因为容器和算法对复写的要求)
2. 元素必须可以被销毁
3. 对于序列容器,元素 必须有默认的构造函数
4. 对于某些操作, 元素需要定义 ==
5. 对于关联容器,排序准则默认的是: <, std:less
6. 无顺序容器,必须要提供一个 hash函数, 需要 ==
7. stl容器里面 存的是元素的值,而不是引用
8. 容器里面应该存放:
- 基本元素
- class : 满足上述
9. stl的设计原则是效率优先,安全为次
3. 容器的通用接口


4. 基本使用
4.1 array




4.2 vector



使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的push_back,map的insert,set的insert。这些插入操作会涉及到两次构造,首先是对象的初始化构造,接着在插入的时候会复制一次,会触发拷贝构造。但是很多时候我们并不需要两次构造带来效率的浪费,如果可以在插入的时候直接构造,就只需要构造一次就够了。
C++11标准已经有这样的语法可以直接使用了,那就是emplace。vector有两个函数可以使用:emplace,emplace_back。emplace类似insert,emplace_back类似push_back。
摘自:https://blog.csdn.net/windpenguin/article/details/75581552

4.3 deque
deque(双端队列)是一个动态数组,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速。 在中间部分安插元素则比较费时,因为必须移动其它元素。




4.4 list
list用自己内置的算法比较好



4.6 forward_list

不能随机访问



4.7 set
频繁使用插入删除,可以考虑使用之。





4.8 map


emplace()构造生成的时候是以move的方式,来放到位置上去的
b.emplace(std::pair<const int, std::string>(10, std::string("aga"));
推荐用emplace来代替insert
map的[]形式,必须有默认构造函数(不推荐)


4.9 unordered_map(c++11)
优点:效率很高,查找删除是常数算法
缺点:空间上用的多,无序,适合一千万以下数据。

#include <iostream>
#include <set>
#include <string>
#include <algorithm>
#include <unordered_map>
using namespace std; class Position{
public :
int x() const { return m_x; }
int y() const { return m_y; }
private:
int m_x = ;
int m_y = ;
}; // 使用unordered_map需要实现这个
namespace std {
template<> struct hash<Position> {
size_t operator() (const Position& p) const { //对Postion做Hash ,模板类刻画
return p.x() + p.y();
}
};
} class Person {
private:
int m_age;
string m_name;
public:
Person(int a, string n) : m_age(a), m_name(move(n)) { }
int age() const {
return m_age;
}
const string& name() const {
return m_name;
}
void print() const { cout << m_age << " : " << m_name << endl; }
void changeAge(int newAge) { m_age = newAge; }
bool operator == (Person const& rhs) const {
return m_age == rhs.m_age && m_name == rhs.m_name;
} }; void testUnordered_map()
{
using Group = std::unordered_map<Position, Person>;
Group group;
}
//
//struct CompareAge {
// template<typename T>
// bool operator()(const T& t1, const T& t2) const {
// return t1.age() < t2.age();
// }
//}; int main()
{
testUnordered_map(); return ;
}
深入学习c++--容器的更多相关文章
- Spring.NET依赖注入框架学习--实例化容器常用方法
Spring.NET依赖注入框架学习---实例化容器常用方法 本篇学习实例化Spring.NET容器的俩种方式 1.通过XmlObjectFactory创建一个Spring.NET容器 IResour ...
- 5.docker学习之容器
容器创建 我们已经知道,镜像是只读的,而基于镜像创建出来的容器是可读写的,所以,一般我们实际中,会经常使用对应镜像创建容器并且使用这些容器.同样,如果我们想要使用容器,那么我们必须首先需要创建容器.而 ...
- c++学习之容器细枝末节(2)
从昨天到现在,还依然停留在容器的学习上,现在写例程代码顺手多了,看来写代码还是要多多练习才能有感觉. 经过一天的学习,有一下几点知识点让我觉得很有意义: (1)删除容器中的元素的时候,pop_fron ...
- c++学习之容器细枝末节(1)
对照着c++primier 开始学习第九章容器,把课后习题当做练习,虽然是看过书上的讲解,但是做题编程的时候,一些需要注意的地方还是难免有遗漏. 一下是几点印象比较深刻的总结: (1)前几章只学了ve ...
- ###STL学习--关联容器
点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的关联容器. ###stl学习 |--迭 ...
- 创建ApplicationContext与BeanFactory时的区别-Spring源码学习之容器的基本实现
传送门 可以加载XML两种方法 使用 BeanFactory 加载 XML BeanFactory bf = new XmlBeanFactory(new ClassPathResource(&quo ...
- 侯捷STL学习(十)--容器hashtable探索(unordered set/map)
layout: post title: 侯捷STL学习(十) date: 2017-07-23 tag: 侯捷STL --- 第二十三节 容器hashtable探索 hashtable冲突(碰撞)处理 ...
- spring源码学习之容器的基本实现
最近想拿出一部分时间来学习一下spring的源码,还特意买了一本书结合来看,当然主要是学习并跟着作者的思路来踏上学习spring的源码的道路,特意在此记录一下,<spring源码深度解析> ...
- laravel学习:容器绑定与解析
1.在服务容器中注册类(bind) $this->app->bind('sender','MailSender');//$this->app成为服务容器. 2.从服务容器生成类( ...
- Spring源码学习之容器的基本实现(一)
前言 最近学习了<<Spring源码深度解析>>受益匪浅,本博客是对学习内容的一个总结.分享,方便日后自己复习或与一同学习的小伙伴一起探讨之用. 建议与源码配合使用,效果更嘉, ...
随机推荐
- python实现抖音多线程下载无水印视频【附源码】
昨天发了一个无水印解析,评论说想要多线程下载,还是比较简单的. py文件同目录下创建url.txt,把链接一行一行复制进去,就能批量下载. 代码中的延时不能去掉,由于是多线程,速度较快,延时很重要. ...
- 移动端跨平台应用开发(ios、Android、web)- Flutter 技术
关键词:Google 出品:Dart语言:Flutter Engine引擎:响应式设计模式:原生渲染:免费并且开源 一.简介 Flutter 是谷歌2018年发布的跨平台移动UI框架.作为谷歌的开源移 ...
- linux第一天命令
命令 : 命令 [选项] [参数] /;根目录 用户主目录:/home/用户名 <==> ~ 1.ls 显示路径中的内容 ls [参数] [路径] ls ls -l ...
- stm32f103c8t6 怎么使用IAP下载程序
首先下载官方STM32F10X的IAP Bootloader源码,STM32F10x_AN2557_FW_V3.3.0. 用Keil4打开工程代码STM32F10x_AN2557_FW_V3.3.0P ...
- 模拟赛20181101 雅礼 Wearry 施工 蔬菜 联盟
% Day2 Solution % Wearry % Stay determined! 施工 记 fif_{i}fi 表示考虑前 iii 个建筑, 并且第 iii 个建筑的高度不变的答案, 每 ...
- flash文件上传下载组件
以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传 ...
- HTML5类操作
一.获取DOM的方式 ①通过类名获取元素,以伪数组形式存在 document.getElementsByClassName("class"); ②通过css选择器获取元素,符合匹配 ...
- vue vue-cli中引入全局less变量的方式
我们经常用less定义一些全局变量,比如主题的颜色,为了避免在每个组件中引用我首先尝试放在main.js中,发现并不起作用... 先看vue-cli2.x 版本如何解决 1.安装; npm insta ...
- [内网渗透]lcx端口转发
0x01 简介 lcx是一款端口转发工具,有三个功能: 第一个功能将本地端口转发到远程主机某个端口上 第二个功能将本地端口转发到本地另一个端口上 第三个功能是进行监听并进行转发使用 Lcx使用的前提是 ...
- dbutils的环境搭建以及使用
DBUtils的简单实现方式 第一步.创建Java工程[此处使用的是maven工程]并导入jar包 <!--导入mysql数据库驱动--> <dependency> <g ...