这是本人从网上整理到个人笔记的内容,现发表到博客上记录,希望能给刚开始学习C++编程的同学提供帮助。如有侵权立刻删除。
C++ STL
目录
目录
*注意事项*
在用任何容器进行删除操作的时候,应当格外小心迭代器失效的问题。不同容器对元素删除产生的后果不尽相同,但是大部分情况下会出现当前甚至所有迭代器失效的情况。如果进行删除操作,需确保完成后迭代器的指向仍正确。
顺序容器
一种各元素之间有顺序关系的线性表,每个元素有固定的位置,容器不会根据元素特点来排序,保留了操作元素时的逻辑顺序。
vector 向量
特点
•可以从后方快速的插入和删除,并且能直接访问任何元素(随机访问迭代器)
用法
•初始化
vector<int> vec; //vec为空
vector<int> vec2(vec1); //用vec1初始化vec2
vector<int> vec(iterator1,iterator2) //用迭代器中间的部分初始化
vector<int> vec(10); //初始含有10个值为0的元素
vector<int> vec(10,1); //初始含有10个值为1的元素
•方法
vector.push_back(var); //尾部插入元素
vector.pop_back(); //删除尾部元素
vector.size(); //返回所含元素个数(int)
vector.empty(); //返回是否为空(bool)
vector.insert(iterator,n,num); //在iterator指向的位置插入n个值为num的元素
vector.erase(iterator1,iterator2); //删除iterator1到iterator2(不包括iterator2)之间的元素,其他元素位置前移
vector.clear(); //清空元素
•遍历
•下标遍历(随机访问迭代器)•迭代器法
list 双向链表
特点
•双链表,从任意地方快速插入与删除(双向迭代器)
用法
•初始化
list<int> lis; //默认创建空list
list<int> lis1(lis2); //用lis2初始化lis1
list<int> lis(iterator1,iterator2); //同上
list<int> lis(10); //含有10个元素的list
list<int> lis(10,1); //含有10个元素1的list
•方法
list.push_back(var); //在尾端插入元素
list.pop_back(); //删除末尾值
list.size(); //返回元素个数(int)
list.empty(); //返回是否为空
list.insert(iterator,n,num); //在iterator指向的位置插入n个值为num的元素
list.erase(iterator1,iterator2); //删除迭代器12之间的元素
list.clear(); //清空元素
list.front(); //返回第一个元素的引用
list.back(); //返回最后一个元素的引用
list.remove(var); //清除所有与其重复的元素
list.unique(); //删除相邻重复元素
list.sort(); //排序
•遍历
•迭代器法
deque 双端队列
特点
•从前后快速插入,可以直接访问任何元素(随机访问迭代器)
用法
•和[[#vector 向量|vector 向量]]用法基本相同,增加了push_front(var)
可以从头部插入元素
关联容器
非线性的二叉树结构,由红黑树实现。提供了根据元素特点自动排序的功能,加快了获取元素的速度。
map 字典
特点
•一对多映射,查找十分快速,但是不允许重复的键出现(双向迭代器)
用法
•初始化
map<int,string> m; //空map
map<int,string> m1(m2); //用m2初始化m1
•用法
map[key] = value; //插入/修改元素
map.insert(pair<var,var> (key,value)); //插入元素
map.size(); //返回map元素个数(int)
map.empty(); //返回map是否为空(bool)
map.find(key); //查找元素,返回指向该元素的迭代器,如果没有该元素则返回指向map.end()的迭代器
map[key]; //根据键取得值
iterator->first; //根据迭代器取得键
iterator->second; //根据迭代器取得值
map.erase(iterator); //根据迭代器删除元素
map.erase(key); //根据键删除元素
map.clear(); //清空map
•遍历
•迭代器法
set 集合
特点
•查找非常迅速,但是不允许重复的元素出现(双向迭代器)
用法
•同[[#map 字典||map 字典]]的用法,只是访问元素的方法是* iterator。当set存储的是结构体的化,也可以用iterator->来访问结构体内部对应的数据。
容器适配器
让一种已经存在的容器类型以另一种不同给工作方式运作。
stack 栈
特点
•后进先出,先进后出(无迭代器)
用法
•初始化
stack<int> s; //默认生成空栈
stack<int> s1(s2); //用s2初始化s1
•用法
stack.push(val); //向栈顶压入元素
stack.pop(); //弹出栈顶元素
stack.top(); //返回栈顶元素的引用 !!栈不能为空
stack.empty(); //返回栈是否为空(bool)
stack.size(); //返回栈内元素数量
stack1.swap(stack2); //交换两个stack内容
stack<int>().swap(stack1); //清空stack1
•遍历
•无法遍历,只能一个个弹出,需注意栈弹空后出错的问题
queue 队列
特点
•先进先出,后进后出(无迭代器)
用法
•和[[#stack 栈|stack 栈]]基本相同,pop()弹出的是最先进入的元素•front()和back(),返回第一个和最后一个元素的引用,如果queue为空,则返回值是未定义的
C++ iterator 迭代器
特色
C++ 的迭代器是最简单的,它没有新形式的接口,和指针的行为非常相似,也支持自增操作。
使用
定义分类
•正向迭代器 iterator
•反向迭代器 reverse_iterator
•常量正向迭代器 const_iterator
//不可修改其指向的元素
•常量反向迭代器 const_reverse_iterator
//不可修改其指向的元素
声明方法
容器类名::迭代器类型 迭代器名;
功能分类
•单向迭代器 可以使用++it , it++ , * it 等操作。可以互相赋值,可以用 == 比较
•正向 使用++操作等同访问下一个元素•反向 使用++操作等同访问上一个元素
•双向迭代器 支持单项迭代器的全部功能,此外还支持 -- 操作•随机访问迭代器 支持双向迭代器的全部功能,并且迭代器it还可以支持+= , -= ,+int , -int , it[i] (返回it后面第i个元素) 的功能
•随机访问迭代器也支持< , > , <= , >=的比较,也支持两个随机访问迭代器it1-it2的操作,返回值为it2和it1所指向的元素序号只差(it2和it1之间元素个数减1)
辅助函数
==需要头文件#include <algorithm>
==
- advance(it, n); //将迭代器it向前或向后移动n个元素
- distance(it1, it2); //返回两个元素间的距离,如果调用时it1在it2后方则会进入死循环 ^^^^^^^
- iter_swap(it1, it2); //交换两个迭代器it1\it2指向的值
不同容器的迭代器
STL | iterator |
vector | 随机访问 |
deque | 随机访问 |
list | 双向 |
set/multiset | 双向 |
map/multimap | 双向 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |