stl

hash_map

强颜欢笑 提交于 2020-04-01 09:36:34
hash_map #ifndef __SGI_STL_INTERNAL_HASH_MAP_H #define __SGI_STL_INTERNAL_HASH_MAP_H #include <concept_checks.h> __STL_BEGIN_NAMESPACE #if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32) #pragma set woff 1174 #pragma set woff 1375 #endif // Forward declaration of equality operator; needed for friend declaration. template <class _Key, class _Tp, class _HashFcn __STL_DEPENDENT_DEFAULT_TMPL(hash<_Key>), class _EqualKey __STL_DEPENDENT_DEFAULT_TMPL(equal_to<_Key>), class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) > class hash_map; template <class _Key, class _Tp, class _HashFn,

STL--set使用用法

我们两清 提交于 2020-04-01 05:22:03
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器。( 相同的值不存,存进去自动排序好了 ) set/multiset会根据待定的排序准则,自动将元素排序 。两者不同在于 前者不允许元素重复(重复元素只操作一遍,其他的忽略处理), 而后者允许。(因为插入的时候,它们分别调用的是insert和unique_insert) 同理,map和multimap也是这个意思。set、map它们的 底层都是基于红黑树 。 set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。 平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、和list的容器。另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时,就会自动将元素按键值从小到大的顺序排列。 set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容器set成员函数:clear()--清除所有元素 c++ stl容器set成员函数:count()--返回某个值元素的个数 c++ stl容器set成员函数:empty()--如果集合为空

[C++ STL] deque使用详解

[亡魂溺海] 提交于 2020-03-27 22:57:10
[C++ STL] deque使用详解 目录 一、概述 二、定义及初始化 三、基本操作函数 3.1 容量函数 3.2 添加函数 3.3 删除函数 3.4 访问函数 3.5 其他函数 四、迭代器与算法 五、总结 回到顶部 一、概述 deque(双端队列)是由一段一段的定量连续空间构成,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速。 在中间部分安插元素则比较费时,因为必须移动其它元素。 回到顶部 二、定义及初始化 使用之前必须加相应容器的头文件: #include <deque> // deque属于std命名域的,因此需要通过命名限定,例如using std::deque; 定义的实现代码如下: deque<int> a; // 定义一个int类型的双端队列a deque<int> a(10); // 定义一个int类型的双端队列a,并设置初始大小为10 deque<int> a(10, 1); // 定义一个int类型的双端队列a,并设置初始大小为10且初始值都为1 deque<int> b(a); // 定义并用双端队列a初始化双端队列b deque<int> b(a.begin(), a.begin()+3); // 将双端队列a中从第0个到第2个(共3个)作为双端队列b的初始值 除此之外,还可以直接使用数组来初始化向量: int n[] = { 1, 2, 3, 4

problem with updating a map by removing some keys and also some elements

狂风中的少年 提交于 2020-03-27 08:55:02
问题 I have a map. lets say map<int, vector<int> > mymap1 . I want to update mymap1 by deleting some “keys” and also removing unwanted “elements” from the vector part of the selected keys. The “key’ or the “element” going to be deleted is given from another vector, known as “mylabel”. Actually, What I need to remain in my map is the values whose label is equal to 1. (At the end, keys must have the elements whose label are 1 only.) I have implemented this (see code below), but got some compiler

STL 中 map和set的区别

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-26 09:37:54
转自: http://www.cppblog.com/expter/archive/2008/12/06/68714.html stl中: MAP的节点是一对数据. SET的节点是一个数据. Map使用关键值Key来唯一标识每一个成员 map可以重复。 set是集合 都属于关联容器 只不过, map的形式 map<type1, type2> mymap; set的形式 set<type> myset; set(集合)——包含了经过排序了的数据,这些数据的值(value)必须是唯一的。 map(映射)——经过排序了的二元组的集 合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的)是在排序或搜索时使用,它的值可以在容器中重新获取;而 另一个值是该元素关联的数值。比如,除了可以ar[43] = "overripe"这样找到一个数据,map还可以通过ar["banana"] = "overripe"这样的方法找到一个数据。如果你想获得其中的元素信息,通过输入元素的全名就可以轻松实现。 map是映射集合中的元素不能重复,set可以进行集合的各种操作(交并补等),当然你也可以用list或vector实现set,但是效率会很低。set一般是用平衡树或哈西表实现的。 映射是一种一一对应的关系,哈西表也可以看作是映射的一种。映射通常可用来实现字典结构

(zt)STL中的map与hash_map

牧云@^-^@ 提交于 2020-03-26 00:50:50
(原文 http://show.rednet.cn/user1/213546/archives/2007/35467.html ) 这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自 alvin_lee ,codeproject,codeguru.baidu等等! 先看看alvin_lee 朋友做的解析,我觉得还是很正确的,从算法角度阐述了他们之间的问题! 实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的。做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了。今天改进代码,顺便又来温习基础功课了。   还记得Herb Sutter那极有味道的《C++对话系列》么,在其中《产生真正的hash对象》这个故事里就讲了map的选择。顺便回顾一下,也讲一下我在实用中的理解。   选择map容器,是为了更快的从关键字查找到相关的对象。与使用list这样的线性表容器相比,一可以简化查找的算法,二可以使任意的关键字做索引,并与目标对象配对,优化查找算法。在C++的STL中map是使用树来做查找算法,这种算法差不多相当与list线性容器的折半查找的效率一样,都是O(log2N)

STL algorithm算法min,min_element(35)

╄→гoц情女王★ 提交于 2020-03-24 06:46:17
min样板: std:: min C++98 C++11 C++14 default (1) template <class T> const T& min (const T& a, const T& b); custom (2) template <class T, class Compare> const T& min (const T& a, const T& b, Compare comp); initializer list (3) template <class T> T min (initializer_list<T> il); template <class T, class Compare> T min (initializer_list<T> il, Compare comp); 对于(1),返回两个元素中最小的那个,假设两者同样。则返回a. 使用operator<或者comp进行比較。 对于(3),返回最小的那个元素,假设有多个最小元素,则返回第一个。 其行为类似于: 2 3 template <class T> const T& min (const T& a, const T& b) { return !(b<a)?a:b; // or: return !comp(b,a)?a:b; for version (2) } 一个简单的样例: #include

STL之set具体解释(二)

筅森魡賤 提交于 2020-03-23 14:58:03
首先来看看set集合容器: set集合容器实现了红黑树的平衡二叉树数据结构。在插入元素时它会自己主动调整二叉树的排列,把该元素放到适当的位置,而且 保证左右子树平衡。平衡二叉检索树採用中序遍历算法。 对于set,vector,map等等,它们的前向迭代器定义是这种(以set为例): set<int>::iterator it; for(it=s.begin();it!=s.end();it++){} 那么反向迭代器呢? set<int>::reverse_iterator rit; for(rit=s.rbegin();rit!=s.rend();rit++){} 经常用法:insert(),erase(),find(),clear() find()方法是查找元素方法。假设找到就返回该元素迭代器的位置,否则就返回最后一个元素后面的一个位置。 这样来使用: it=s.find(5); if(it!=s.end()) {} else {} 关于比較函数: 假设元素不是结构体。而是基本数据类型,那么就自定义一个比較函数: [cpp] view plain copy struct cmp { bool operator()( const int &a, const int &b) { return a>b; } }; int main() { set< int ,cmp> s; for (

STL中的内存分配器原理

丶灬走出姿态 提交于 2020-03-21 18:52:44
题记:内存管理一直是C/C++程序的红灯区。关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍。另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等。最近阅读了一些内存管理实现方面的资料和源码,整理了一下,汇编成一个系列介绍一些常用的内存管理策略。 1. STL容器简介 STL提供了很多泛型容器,如vector,list和map。程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写。例如可以通过以下语句创建一个vector,它实际上是一个按需增长的动态数组,其每个元素的类型为int整型: stl::vector<int> array; 拥有这样一个动态数组后,用户只需要调用push_back方法往里面添加对象,而不需要考虑需要多少内存: array.push_back(10); array.push_back(2); vector会根据需要自动增长内存,在array退出其作用域时也会自动销毁占有的内存,这些对于用户来说是透明的,stl容器巧妙的避开了繁琐且易出错的内存管理工作。 2.

STL的内存分配器

耗尽温柔 提交于 2020-03-21 18:51:25
题记: 内存管理一直是C/C++程序的红灯区。关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍。另一类是内存管理的实现,如 linux内核 的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等。 最近阅读了一些内存管理实现方面的资料和源码,整理了一下,汇编成一个系列介绍一些常用的内存管理策略。 1. STL容器简介 STL提供了很多泛型容器,如vector,list和map。程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写。例如可以通过以下语句创建一个vector,它实际上是一个按需增长的动态数组,其每个元素的类型为int整型: stl::vector<int> array; 拥有这样一个动态数组后,用户只需要调用push_back方法往里面添加对象,而不需要考虑需要多少内存: array.push_back(10); array.push_back(2); vector会根据需要自动增长内存,在array退出其作用域时也会自动销毁占有的内存,这些对于用户来说是透明的,stl容器巧妙的避开了繁琐且易出错的内存管理工作。 2