[GeekBand] STL与泛型编程(2)

本篇文章在上一篇文章的基础上进一步介绍一些常用的容器。

一、 Stack和Queue

?

二、 Map

Map是一种关联容器,存储的对象是键值(Key-Value)对。和Python中的字典相似。Map中的键值对永远是排好序的。

Map中所存储的键对象必须是可排序的,默认采用从小到大的排序方式。也可以通过函数对象的方式进行指定。Map的标准头为:


template
<class _Kty,
class _Ty,class _Pr = less<_Kty>,class _Alloc = allocator<Pair<const _Kty,_Ty>>>

class map {...}

其中的less<_Kty>是一个函数式对象,代表了排序函数,分配器通常为默认分配器。

2.1 Map的创建

通过Pair和迭代器创建并初始化,其中Pair的第一个值为键,第二个值为值。


const std::pair<int
,char>items[3]
=
{

????std::make_pair(1,‘a‘),std::make_pair(2,‘b‘),std::make_pair(3,‘c‘)

}

std::map<int,char> map1(item,item+3);

2.2 Map的元素插入

1 通过insert成员函数


map1.insert(std::make_pair(4,‘d‘);

2 直接使用未使用的下标


map1[5]
= ‘e‘;

2.3 Map的元素删除


iterator erase(iterator it);


1 通过一个条目对象删除


iterator erase(iterator first, iterator last);????????


2 删除一个范围


size_type erase(const Key& key);


3 通过键删除

2.4 Map的元素访问

1. 通过key和引用访问


char
&e = map1[2];

e =
‘c‘;

需要注意的是,通过下标访问的方法和插入操作在语法上没有区别,如过使用了一个没有被定义过的键,则会创建一个新的键值对,这通常不是我们所说希望的。因此有第二种方案。

2. 通过成员函数和迭代器


map.count(k)


返回map中键k的出现次数(对于map而言,由于一个key对应一个value,因此返回只有0和1,因此可以用此函数判断k是否在map中)


map.find(k)


??返回map中指向键k的迭代器,如果不存在键k,则返回超出末端迭代器(map1.end())。

2.5 Multimap

和Map基本一致,但是允许出现重复的Key。由于可以出现重复的Key,在Map中可以进行的[]访问和[]插入操作将不能进行而只能通过迭代器和insert()的方式去执行。

三、Set

Set也是一种关联容器,存储的对象可以看做是既作为Key又作为Value。Set和Map非常相似。它实现了红黑树的搜索结构。

同理,Set中所存储的键对象必须是可排序的,默认采用从小到大的排序方式(必须有operator<)。也可以通过函数对象的方式进行指定。set的标准头为:


template
<class _Kty,class _Pr = less<_Kty>,class _Alloc = allocator<Pair< _Kty>>>

class map {...}

其中的less<_Kty>是一个函数式对象,代表了排序函数,分配器通常为默认分配器。

3.1 Set的创建

通过迭代器/指针创建并初始化。


struct betterthan{

????bool
operator()(char a1,char a2){

????????return a1>a2?1:0;

????}

}

const
char items[3]
=
{

????‘a‘,‘b‘,‘c‘

}

std::set<char,betterthan> set1(item,item+3);

3.2 Set的元素插入

通过insert成员函数


set1.insert(‘d‘);

3.3 Set的元素删除


iterator erase(iterator it);


1 通过一个条目对象删除


iterator erase(iterator first, iterator last);????????


2 删除一个范围


size_type erase(const Key& key);


3 通过键值直接删除

时间: 2024-08-21 22:42:07

[GeekBand] STL与泛型编程(2)的相关文章

[GeekBand] STL与泛型编程(1)

在C++语法的学习过程中,我们已经对模板有了基本的了解.泛型编程就是以模板为工具的.泛化的编程思想.本篇文章介绍了一些在之前的文章中没有涉及到的一些模板知识.泛型编程知识和几种容器.关于模板的一些重复知识在这里就不再进行赘述. 一.关于模板的知识点补充 ? 1. 函数模板的参数推导与显式指定 通常情况下,我们一般采用参数的自动推导方式去使用函数模板.在自动推导时,为了确保推导的正确性,C++不允许任何形式的隐式类型转换. 这个限制就导致了如下的情况: template <class T> in

[GeekBand] STL与泛型编程(3)

本篇文章主要介绍泛型算法中的变易.排序.数值算法. 一. 变易算法 所谓变易算法是指那些改变容器中的对象的操作. 1.1 copy组 template <class InputIterator, class OutputIterator> OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result); Copy操作是将两个输入迭代器之间的元素拷贝到输出迭代器处.注意拷贝时采用的是左对齐,

[GeekBand] STL 仿函数入门详解

本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格  http://www.leavesite.com/ 前言:本文主要通过关联容器set解释下仿函数的实现及工作原理. 一.STL六大组件简介 1.Containers(容器):各种数据结构,如Vector,List,Deque,Set,Map,用来存放数据2.Algorithms(算法):如. Sort,Search.3.Iterators(

学习BoolanC++笔记_01(STL与泛型编程第六周)

作者: ayaoko 出处: http://www.cnblogs.com/fyc006/> 关于作者:小可才疏学浅还请多多赐教! 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件([email protected])咨询. 1,你应具备的基础 C++基本语法(包括如何正确使用模板,templates)  2,我们的目标 C++标准库,了解,深入,良好使用,扩展 THE C++ STANDARD LIBRARY 作者:

Boolan C++ STL与泛型编程 二

本周主要是讲解了容器list的使用 List是一种可在常数时间内在任何位置执行插入和删除操作的顺序容器.list是双向链表,其迭代器是双向的.与其他顺序容器(array, vector, deque)相比,list容器在任意位置执行插入.提取.和移动元素的操作更高效,但它不能通过在容器中的位置直接获取元素. list主要拥有这些功能 c.rbegin()      返回逆向链表的第一个元素,即c链表的最后一个数据. c.rend()      返回逆向链表的最后一个元素的下一个位置,即c链表的第

C++ STL泛型编程——在ACM中的运用

学习过C++的朋友们应该对STL和泛型编程这两个名词不会陌生.两者之间的关系不言而喻,泛型编程的思想促使了STL的诞生,而STL则很好地体现了泛型编程这种思想.这次想简单说一下STL在ACM中的一些应用.我们知道,在ACM竞赛中,经常需要用到数组.字符串.队列.堆栈.链表等数据结构和排序.搜索等算法,以提高程序的时间.空间运行效率.然而如果这些数据结构总是需要手工来编写,那无疑会是一件很麻烦的工作,而STL的出现很好地解决了这个问题. 我们简单来了解一下STL.STL提供了三种类型的组件:容器.

STL之父Stepanov谈泛型编程的发展史

这是一篇Dr. Dobb's Journal对STL之父stepanov的采访.文中数次提到STL的基本思想.语言的特性.编程的一些根本问题等,非常精彩.这篇文章让我想去拜读下stepanov的大作<Elements of Programming>了.原文链接: http://www.stepanovpapers.com/drdobbs-interview.html 我先对文章内容做下总结,并在最后附上原文,把一些认为重要又精彩的语句进行了标红. Stepanov讲到其关于“泛型编程”(gen

&lt;&lt;C++标准程序库&gt;&gt;中的STL简单学习笔记

0. 内容为个人学习笔记, 仅供参考, 如有错漏, 欢迎指正! 1. STL中的所有组件都是由模板构成的, 所以其元素可以是任意型别的. 组件有: - 容器: 管理某类对象的集合. 不同的容器有各自的优缺点. - 迭代器: 用来在一个对象集群(Collection of Objects) 的元素上进行遍历. 这个CoB可以是容器/容器的一部分. 每种容器都提供了自己的迭代器. - 算法(Algorithm): 用来处理集群内的元素(比如: 查询,修改,排序等). - 适配器(adapter) -

STL之序列容器deque

首先看看deque的模板声明: template <class T,  class Alloc = allocator<T>>  // 原本还有个参数BufSize,现在新版本内置了,不允许用户指定了. class deque { //… protected: // 数据成员 iterator start; // 表现第一个节点 iterator finish; // 表现最后一个节点 map_pointer map; // 指向map, map是块连续空间,其内的每个元素都是一个