目录
STL"标准模板库"
迭代器
一.vector
*deque双向队列
*list双链表
map 集合结构
STL"标准模板库"
c++的核心
STL容器:
序列式容器
元素固定位置,元素位置取决于插入的时机和地点,与值无关,vector,list,deque
关系式容器
取决于元素值的大小,set,multiset,map,multim
特性
1.外部数据外部管理,内部数据内部管理
2.多次遍历元素次序相同
3.各项操作并非绝对安全
迭代器
用来访问类中的所有元素,行为类似指针
访问特性:半开区间(左闭右开).
定义迭代器
vector
删除迭代器会失效,可获取删除位置的下一个位置
一.vector
封装了动态大小数组的顺序容器,vector是一个能够存放任意类型的动态数组,也称为向量
使用:#include
//类名<类型>对象名
//半倍扩容
size/2 比1小 加一
比一大 加一半
尾删只是无法访问
v.at 会判断越界
自己扩容
1.resize 会赋值
2.reserve 不会赋值
二维数组
1.int row , col;2.vector> vv;3.vv.reserve(row)//q4.for循环确定列
*deque双向队列
deque是双向开口的连续线性空间(动态的将多个连续空间通过指针数组联系在一起)
头尾均可快速插入和删除
中间比较慢
插入
dequedq; for (int i = 0; i < 6; ++i) { dq.push_back(i + 1); } for (int i = 0; i < 6; ++i) { dq.push_front(i*11 + 11); }
删除
dq.pop_front(); dq.pop_back();
迭代器定义 //出现内存重分配,迭代器会失效(顺序结构)
deque::iterator dit;
erase()函数删除pos位置上的元素,或者删除start和end之间的所有元素。返回值是一个iterator,指向被删除元素的后一个元素。
迭代器遍历deque
int i = 0;
for (dit = dq.begin(); dit != dq.end(); dit++, ++i)
{
printf("dq[%i]=%in", i + 1, *dit);
}
*list双链表
1.不支持随机存取
2.任何位置删除插入很快
3.插入删除不会导致指向其他元素的指针引用迭代器失效
listL; for (int i = 0; i < 6; ++i) { L.push_back(i + 1); } for (int i = 0; i < 6; ++i) { L.push_front(i * 11 + 11); }
定义迭代器
list::iterator lit; lit = L.begin(); //list无法随机访问,只能迭代器++伪随机访问 for (int i = 0; i < 5; ++i) lit++;
按数值删除
L.remove(11);//没有就不删
list进阶应用
按条件删除
L.remove_if(isBase); //通过回调函数判断是否删除
去重函数 L.unique(); //两两判断删除
传入回调达成升序降序效果
map 集合结构
//二叉查找树 和c#的list类似
map的元素类型Key和T
1.Key 和value 必须满足可赋值和可复制的性质
2.key必须可比较
3.根据已知的key搜寻某个元素性能比已知value搜寻某个元素性能好
mapm; //插入 m[1] = 3.14; m[2] = 2.68; m[0] = 3.33; //删除 //根据key值删除 m.erase(1); //迭代器 map ::iterator mit; //同样不支持随机访问 for (mit = m.begin(); mit != m.end(); mit++) printf("key %i =%fn", mit->first, mit->second);
元素的插入
//元素的插入 m.insert(std::pair(8, 123));//pair进行结构创建 m.insert(map ::value_type(9, 444));//调用成员函数 m.insert(std::make_pair(5, 2.333));//捏造一个结构
//默认升序 map> mm;//greater按照string为key进行降序 map > mmm;//less按照int为key进行升序
Multimap 允许可重复的元素



