C++容器:顺序容器,关联容器
2010-08-02 11:17
483 查看
容器主要分为顺序容器和关联容器。 一,顺序容器 vector--连续存储的元素,单向的 list----由节点组成的不连续存储的双向鏈表 deque--连续存储的元素,双向的 1,顺序容器主要分为vector, deque, list。 2,容器内的元素类型必须至少满足2个条件:可复制和可赋值。 3,list容器的迭代器,不支持算术运算,不支持关系运算,也没有下标操作,只有最简单的自增 自减 相等 不等 运算。 4,所有的 迭代器范围都是左闭合区间, [beg,end) 包括beg,但不包括end 5,顺序容器定义的几种类型: size_type 容器大小 iterator 迭代器, reverse_iterator 逆序迭代器 const_iterator 只读迭代器(指向的元素只读), const_reverse_iterator difference_type 迭代器的差值,可为负值 value_type 元素类型 reference 相当于 value_type&,即指向迭代器对应的元素 const_reference 相当于const value_type & 6,a.begin() a.end() 对应于 iterator;a.rbegin() a.rend() 对应于reverse_iterator, 注意,如果a是const的,那么iterator也必须是const_iterator的 7,添加元素的擦作 a.push_back(t); 在a末尾增加元素t; a.push_front(t); 在a前端增加元素t,只使用于list和deque a.insert(p,t); 在迭代器p前面插入元素t,返回新元素的迭代器 a.insert(p,n,t); 在迭代器p前面插入n个元素t,返回void a.insert(p,b,e);在迭代器p前面插入迭代器b,e标记的范围内的元素,返回void 8,删除元素的操作 a.pop_back();删除a的最后一个元素,返回void,如果a为空,则函数未定义 a.pop_front();删除a的第一个元素,返回void;如果a为空,则函数未定义;只适用于list和deque a.erase(p); 删除迭代器p指向的元素,返回下一个元素的迭代器; a.erase(b,e);删除迭代器b,e之间的元素,返回下一个元素的迭代器 a.clear();删除a的所有元素,返回void 9,容器空间大小的操作 a.size() 元素个数 c.max_size() 最大元素个数 a.empty() bool值,指示a是否为空 c.resize(n,t) 重置c的大小为n,且 新增加的元素初始化为t。 10, a.begin() a.end()指向iterator a.front() a.back() 指向reference 注意,vector<int>::reference last=a.back(), last1=*--a.end(); ,a.back指向最后一个元素,a.end指向最后一个元素的下一位置 11,顺序容器的赋值操作 c1=c2; c1.swap(c2); c1 c2 互换 c.assign(b,e); 将迭代器b,e之间的元素复制给c c.assign(n,t); 将c设置为n个值为t的元素 以上操作,都是首先删除c原来的所有元素后再进行的操作 二,顺序容器适配器(adaptor) stack--后进先出的排列,类似 堆 #include<stack> queue--先进先出的排列,队列 priority_queue--优先队列 #include<queue> 1,适配器的初始化 适配器都是建立在某个顺序容器之上的。 stack<int> stk(deg); 其中,deg为deque<int>; 也就是说,创建适配器时,一般将一个顺序容器指定为其原本。 默认的stack和queue是基于deque实现的。 priority_queue则默认在vector上实现。 但是,实际上 statck可以建立在vector,list,deque任何一种容器之上 queue要求关联容器提供front操作,所以只有list和deque满足 priority_queue要求提供随机访问功能 ,所有只有vector和deque满足 如果适配器不是建在其默认类型上,则必须显式的指定其关联类型 stack<int, vector<int> > stk(ve); 其中ve为vector<int>类型。 2,栈适配器stack的使用 先进后出 stk.empty() bool,空为true stk.size() 元素个数 stk.pop() 删除栈顶元素,但是不返回其值 stk.top() 返回栈顶元素,但不删除其值 stk.push(item); 在栈顶压入item元素 3,队列和优先级队列 先进先出,优先级队列则按照优先级 三,关联容器(associative container) map,multimap 类 --#include<map> set , multiset 类 -- #include<set> 关联容器,通过 键 存储和读取元素。顺序容器,通过元素在容器中的位置顺序存储和读取元素。 关联容器map的用法: 1,map的定义 map<k,v> m; k为键类型,v为值类型 map<k,v> m(m2); map<k,v> m(b,e); 将迭代器b e 之间的元素复制到m 2,键类型必须满足严格弱排序,即 < 一定要定义,且大于 等于时都视为等于关系 如 p1<p2,表示p1.first()<p2.first() || (!(p1.first()<p2.first)&&p1.second()<p2.seconf() ) 3,map的类型 map<k,v>::key_type 键类型,而且是const的, const k map<k,v>::mapped_type 值类型,v map<k,v>::value_type 键-值对应的pair类型,pair<k,v> 4,使用下标访问map对象,可以直接添加新元素 map<string,int> w; w["ab"]=2; 如果w中不存在ab键,则会自动添加一个value_type,设置为"ab"--2 5,对map迭代器解引用,返回value_type 对map进行下标操作,返回mapped_type 6,map.insert(e); e为pair类型,如果其键不存在,则新建;如果键已经存在,则m不变; 返回值为pair类型,其中pair.first为指向此键的迭代器, pair.second为bool,指示是否插入了该元素。 m.insert(beg,end); 插入迭代器范围,返回void,规则同上 m.insert(iter,e); iter为迭代器,以iter为起点搜索,查找是否有e.first对应的键元素,如果没有,则插入e。返回一个迭代器,指向具有e.first键的元素 7,删除map中元素 m.erase(k); 删除键k对应元素,返回删除个数(map中,只能为0或者1) m.erase(p);删除迭代器p对应元素,返回void m.erase(b,e);删除迭代器b e之间元素,返回boid 8,检查map中键是否存在 m.count(k) 返回键k在m中出现的次数 m.find(k) 返回键k在m中首次出现的迭代器;不存在则返回末端迭代器 9,map中,内存存在方式类型list是不连续的。 所以,map的迭代器只有简单的自增 自减操作,而且map中没有push pop相关操作。 但是,map提供下标操作,只是它的下标操作和顺序容器是不一样的。 关联容器set: set与map不同的地方在于:set仅有key_type类型,它的value_type 也就是key_type;而且set不提供下标操作。 set也支持count find 操作,类似map。 关联容器multimap multiset: 一个键可以对应多个实例 1,insert总会添加一个新元素,不管键是否存在 2,erase会删除拥有该键的所有元素 3,在multimap中,拥有相同键的元素是相邻存放的 。 |
相关文章推荐
- C++学习基础四——顺序容器和关联容器
- C++容器:顺序容器,关联容器
- C++ :顺序容器、关联容器
- C++ 学习笔记 2.1 : 容器和算法(顺序容器、关联容器、泛型算法)
- C++容器:顺序容器,关联容器
- C++容器:顺序容器,关联容器
- C++容器:顺序容器,关联容器
- C++容器(顺序容器、关联容器)
- C++ 9.1 顺序容器-----vector、list、deque
- C++ Primer之顺序容器(二):迭代器
- [C++ 面试基础知识总结] 关联容器
- 【重学《C++Primer第四版》】第九章第十章、容器(顺序容器和关联容器)
- C++之STL中常用关联容器使用方法
- c++中在顺序容器中访问、插入、删除元素的操作
- C++顺序容器之deque初探
- C++ 10.4 关联容器-----set 类型
- C++ 无序关联容器
- C++ 关联容器详细介绍
- C++打印任意顺序容器(sequential container)的内容
- c++顺序容器的学习