为什么80%的码农都做不了架构师?>>>   

极客班 C++ STL (容器算法)第二周笔记

标签(空格分隔): C++


1. 容器(下)

1.1 Stack

a. 概述

Stack 是一种先进先后出(First In Last Out)的数据结构,只有一个出口。 特点:

  • 支持的操作有

    • push , pop , top
  • 只能访问顶端元素,不允许便利
  • 要使用Stack,必须引入<stack> 头文件(标准库)

#include<stack>
int main()
{std::stack<int> s; //必须提供泛化参数s.push(1); //将1压栈s.pop();   //弹出栈顶元素s.size();  //获取栈大小return 0;
}

b. Stack的底层数据结构(1)

查看标准库头文件,我们可以知道,STL stack是以deque作为默认底层结构的:

     // TEMPLATE CLASS stack
template<class _Ty,class _Container = deque<_Ty> >class stack{ // LIFO queue implemented with a container//...}

联系我们在C++ OOP面向对象设计接触到的方法,这种设计就是一种对既有接口的包装,适配,即采用了adapter模式。该模式在这里是包装了deque,并给出了push/pop/top等栈特有的接口。

由于stack不允许遍历,所以没有iterator。

c. Stack的底层数据结构(2)

在 1.1小节中,我们看到了stack的底层定义,发现在模板参数里的容器选项中,是传入了一个deque<_Ty>作为默认参数。 所以,我们除了deque<T>,list<T>其实也是可以拿来作为底层的数据结构的。

//e.g.std::stack<int, std::list<int>> s;
s.push(1);
s.pop();
s.top();
s.size();

1.2 Queue

a. 概述

Queue呢,就是一种先进先出的数据结构, 有两个出口。 - 支持四种操作:push(增加元素),移除元素(pop),获取最前面的元素(front),获取最后面的元素(back) - 只能访问最前或者最后的元素 - 需要引入标准库<queue>才可以使用


#include<queue>
int main()
{std::queue<int> q;//初始化一个存放int型别的队列q.push(1); //插入元素q.pop();   //移除元素q.back();  //获取最后一个元素q.front(); //获取最前面的元素
}

b. queue的底层数据结构(1)

查看标准库,我们可知,与stack一样,queue也是包装了deque<T>

// TEMPLATE CLASS queue
template<class _Ty,class _Container = deque<_Ty> >class queue{     // FIFO queue implemented with a container//...}

有了这一层的认识,我们可以知道,由于不允许遍历,和stack一样所以queue也没有迭代器(iterator)。

c. queue的底层数据结构(2)

stack类似,queue也是可以以list作为底层数据结构的。具体示例暂时不给出了(接口不变,只是换了底层实现)。

1.3 Map and Multimap

1.3.1 Map 概述

Map的特性

  • 是一种关联容器,存储的是key/value pair
  • 不允许key重复
  • map存储的对象必须是具有可排序性的
     // TEMPLATE CLASS map
template<class _Kty,class _Ty,class _Pr = less<_Kty>,class _Alloc = allocator<pair<const _Kty, _Ty> > >class map: public _Tree<_Tmap_traits<_Kty, _Ty, _Pr, _Alloc, false> >{ // ordered red-black tree of {key, mapped} values, unique keys//...}

其中,

  • _Kty 就是对应的键key
  • _Ty 就是对应的值value
  • _Pr 对应的排序算法,默认是less<T>算法,即按_Kty排序,那么,_Kty必须要实现比较操作符operator <
    • 我们也可以自定义算法(通过仿函数来实现)
  • _Alloc 内存分配算法(针对这个键值对的)

1.3.2 例子

//STL_test.h//map value
struct Employee {Employee(){}Employee(const std::wstring& wszName):Name(wszName){}std::wstring Name;void print() const{std::wcout << Name << "\n";}
};//仿函数,定义比较大小
struct ReversId :public std::binary_function<int, int, bool>
{bool operator()(const int& key1, const int &key2){return (key1 <= key2) ? false : true;}
};//for_each 打印
struct FunctorPrintMapValue{void operator()(const std::pair<int, Employee> pair){pair.second.print();}
};
//STL_test.cppint main()
{const int size = 3;std::pair<int, Employee> items[size] = {std::make_pair(1, Employee(L"Tom")),std::make_pair(2, Employee(L"Jerry")),std::make_pair(3, Employee(L"Alice"))};std::map<int, Employee, ReversId> m(items, items + size);std::for_each(m.begin(), m.end(), FunctorPrintMapValue());system("pause");return 0;
}

结果:

我们可以看出,按照自定义的less算法,确实实现了按key倒排序。

1.4 Set and Multset

set 跟map略有不一样,感觉上像是map的特殊版本,因为,在set中,

  • 存储的对象本身,既是key,又是value
  • 不允许有重复的key
  • set存储的对象,必须是具有可排序性
    • 要达到这个目标,那么存储的对象必须实现了operator <操作符
    • 支持自定义排序行为(通过仿函数实现)
  • 必须是引入<set>标准库,通过std::set 访问

下面是一个示例,接着Employee示例来:

//STL_test.h//set 按名字比较排序仿函数
struct FunctorEmployeeNameComparer:public std::binary_function<Employee,Employee,bool>
{bool operator()(const Employee& EmpLeft, const Employee& EmpRight) {return EmpLeft.getName() < EmpRight.getName();}
};//for_each 打印set
struct FunctorPrintSetValue
{void operator()(const Employee& emp){emp.print();}
};
//STL_test.cpp//2. setconst int nSize = 4;Employee person[] = {Employee(L"Tom"),Employee(L"Jerry"),Employee(L"Alice"),Employee(L"Tony")};std::set<Employee, FunctorEmployeeNameComparer> epSet(person, person + nSize);std::for_each(epSet.begin(), epSet.end(), FunctorPrintSetValue());

结果:

2. STL整体结构,仿函数(仿函数适配器),binder1st

3. binder2nd, mem_fun, mem_fun_ref,一些注意的问题

4. 泛型算法_非变异算法

转载于:https://my.oschina.net/lxrm/blog/659980

极客班C++ STL(容器)第二周笔记相关推荐

  1. 极客班GeekBand - 互联网思维修炼 - 1

    极客班GeekBand - 互联网思维修炼 - 1 极客班GeekBand - 互联网思维修炼 - 1 讲师 - 陈世欣 名人看法 第一部分 产品探索 痛点思维 天使用户 天使用户可以加快对产品的探索 ...

  2. 极客时间-如何设计一个秒杀系统-笔记0到2章

    极客时间-如何设计一个秒杀系统-笔记0到2章 0.开篇词-系统秒杀系统架构设计都有哪些关键点? 1.设计秒杀系统时应该注意的5个架构原则 1.数据要尽量少 2.请求数要尽量少 3.路径要尽量少 4.依 ...

  3. 极客时间_软件设计之美 笔记

    极客时间_软件设计之美 笔记 1.软件设计是什么 写代码前应该有模型设计 比如mvc结构就是一种模型 代码应该有规范, 产品内部原则 避免每个开发按自己的想法实现,有人写rest 有人写mvc 代码模 ...

  4. 项目管理Markdown (第二周笔记)

    项目管理Markdown (第二周笔记) 1. 标题大小 输入以下代码 # 第一标题 ## 第二标题 ### 第三标题 #### 第四标题 ##### 第五标题 ###### 第六标题 展示如下 第一 ...

  5. phtyon第二周笔记

    phtyon的第二周笔记 三月二十四日 三月二十六日 三月二十八日 三月二十四日 给一个半径,求圆的面积和周长. 输入两个数,比较大小后,从小到大打印 依次输入若干个整数,打印出最大值.如果输入为空, ...

  6. Python课程第二周笔记及作业练习

    Python第二周 第二周笔记 作业 练习 第二周笔记 机器语言:代码直接执行,与CPU型号有关: 汇编语言:有助记符,汇编器,与CPU型号有关: 高级语言:接近自然语言,编译器或解释器,与CPU型号 ...

  7. 《极客与团队》一第二章 培养出色的团队文化

    本节书摘来异步社区<极客与团队>一书中的第2章,作者: [美]Brian W. Fitzpatrick , Ben Collins-Sussman 译者: 徐旭铭 责编: 陈冀康, 更多章 ...

  8. Geekban极客班 第三周

    复合 composition template<class T,class Sequence=deque<T> > class queue{... protected:Sequ ...

  9. Boolan STL 第三周笔记

    各种类型container deque deque是一种分段连续的容器,特点是双向开口,使用起来可以认为它是一段连续的内存空间,不仅可以向前方增加内存空间,也可以向后方增加内存空间. deque 模拟 ...

最新文章

  1. 如何使用Android studio创建签名
  2. 由熊猫烧香引发的思考
  3. linux 备份mbr,MBR的备份与恢复
  4. 【9303】平面分割
  5. 网龙面试后多久有回应_回应面试问题
  6. Grunt 之通配符
  7. CStdioFile写文件中出现的问题
  8. 瑞幸咖啡 CEO 和 COO 被暂停职务;快手起诉抖音索赔 500 万元;Wine 5.8 发布 | 极客头条...
  9. vbs实现恶搞无限弹窗,复制粘贴就能用
  10. 林子雨-2.3 面向对象编程基础
  11. html段落简字前带繁字,简繁体字对照表,抄佛经的师兄们必藏
  12. python动物农场小说网站爬虫_中文编程,用python编写小说网站爬虫
  13. 水溶性CdTe/CdSe/ZnS量子点荧光波长620nm-820nm
  14. [Vue warn]: Unknown custom element: <helptext> - did you register the component correctly? For recu
  15. Jbuilder2005破解补丁使用方法和下载地址
  16. php 邮箱附件 大小限制,不能作为电子邮件的附件发送的是什么?
  17. 网易2018校园招聘题目
  18. 拿下阿里三面是后,面试官问我:你是怎么学习Redis的?
  19. 2021衡阳田家炳高考成绩查询,快讯!2020年衡阳各学校高考成绩揭晓!
  20. NB-iot网络的组成架构

热门文章

  1. C#中的WebBrowser控件的使用
  2. 任务 进程 线程区别
  3. Happy Birthday
  4. C#数据库事务原理及实践(下)
  5. mysql xtrabackup-v2_pxc wsrep_sst_method均配置为xtrabackup-v2报错
  6. 模块版网站与html网站,网站新闻模块代码html
  7. vue检测对象值_Vue 不能检测到对象属性的添加或删除,注意!!!
  8. MySQ软件的卸载-通过控制面板方式
  9. OAuth2.0认证
  10. MySQL高级 - SQL优化 - 索引提示