一、STL
一 、概念
底层和各自的效率。
vector:底层是数组,查询快,插入删除慢。
list: 底层是双向链表,查询慢,插入删除快。
都有长度,长度都可以变化,都使用对象调用size()得到,
foreach遍历相同。
获取迭代器的方式相同,迭代器前面加"*"都能取出元素。
取到元素后都能修改。
创建方式完全相同。
二、vector
1、创建vector
vector、list、deque的创建是完全相同的。
注:C5的取值范围是前闭后开[下标2,下标5)
2、得到长度
v.size(),默认长度为0。
vector、list、deque对于size()是完全相同的
3、foreach遍历vector
去掉const修改值:
vector变量
vector、list、deque、set 对于foreach是完全相同的。
4、迭代器
(1)创建vector迭代器变量
vector::iterator it;
(2)得到指向首元素的迭代器
vector::iterator it = myvector.begin();
(3)得到指向最后元素的下一位。
vector::iterator it = myvector.end();
(4)vector迭代器的运算, 都是类中的运算符重载的结果
1、++、 -- 、 示例
2、+整数、 -整数、
3、*
4、关系运算:<、>、>=、<=。
(5)使用迭代器遍历元素
5、获取元素的引用, 修饰元素
得到元素的引用了就可以使用“=”修饰元素的值。
(1)v.at(index) 等效于 v[index]
(2)*it, it是迭代器
封装:根据索引得到元素
*(v.begin()+index)
(3)v.back() 得到最后一个元素
(4)v.front() 得到第一个元素
6、加入与删除元素
加入与删除都会改变容器的长度
(1)尾部加入元素
v.push_back(值)
(2)迭代器指向的元素前插入元素
v.insert(it, 值);
封装:在索引元素前插入元素
v.insert(v.begin+index, 值);
(3)v.pop_back();删除最后一个元素
(4)v.clear();删除所有元素
(5)v.erase(it)删除迭代器指向的元素
封装:删除索引处的元素
v.erase(v.begin()+index);
7、排序
使用c函数sort可以进行排序,要求导入头文件<algorithm>
sort(it1, it2, 排序规则函数)
三、list
1、创建list
vector、list、deque的创建是完全相同的。
2、得到长度
v.size()
vector、list、deque对于size()是完全相同的
3、foreach遍历vector
vector、list、deque、set 对于foreach是完全相同的。
4、迭代器
(1)创建list迭代器变量
list::iterator it;
(2)得到指向首元素的迭代器
list::iterator it = c.begin();
(3)得到指向最后元素的下一位。
list::iterator it = c.end();
(4)list迭代器的运算, 都是类中的运算符重载的结果
1、++、 -- 、
2、+整数、 -整数、 有异常,不能使用
3、*
4、关系运算, 有异常,不能使用
(5)使用迭代器遍历元素
5、获取元素的引用, 修改元素
得到元素的引用了就可以使用“=”修饰元素的值。
(1)c.at(index) 等效于c[index] 有异常
(2)*it, it是迭代器
(3) 根据索引获取元素的引用
(4)c.back() 得到最后一个元素
(5)c.front() 得到第一个元素
6、加入与删除元素
加入与删除都会改变容器的长度
(1)尾部加入元素
v.push_back(值)
(2)最前插入元素
c.push_front(值);
(3)c.insert(it, 值) //把值插入迭代器it指向的元素前面
(4)c.pop_back();删除最后一个元素
(5)c.pop_front();删除第一个元素
(6)v.clear();删除所有元素
(7)v.erase(it)删除迭代器指向的元素
7、排序
使用c函数sort可以进行排序,要求导入头文件
sort(it1, it2, 排序规则函数);
示例:对所有元素排序
sort(c.begin(); c.end(); 排序函数);
四、deque
1 底层是散列桶
2 vector与list中使用的技术,deque都能使用。
五、set/multset
内部不能有重复的元素,当有重复元素时会合并,并且加入的元素会自动排序, 只能取出元素,不能修饰元素。
1、创建set
与vector的创建基本相同,仅仅是在创建的方式上少了两种方式即set c(2)和 set有错。
2、得到长度
c.size();
3、foreach遍历vector
vector、list、deque、set 对于foreach是完全相同的。
4、迭代器
(1)创建set迭代器变量
set::iterator it;
(2)得到指向首元素的迭代器
set::iterator it = c.begin();
(3)得到指向最后元素的下一位。
set::iterator it = c.end();
(4)根据值,找到迭代器。(list,vector,deque没有该函数)
set::iterator it = c.find(v);
(4) set迭代器的运算, 都是类中的运算符重载的结果
1、++、 -- 、 示例
2、+整数、 -整数、 有异常
3、* 只能读,不能修改
4、关系运算 有异常
(5) 使用迭代器遍历元素
5、获取元素的引用, 不能修改元素
获取元素后,是只读的,不能改,并且只能以foreach或it的方式得到其中的元素。
(1) c.at(index) 等效于c[index] 有异常
(2)*it, it是迭代器, 只读的,不能改
(3) 根据索引获取元素的引用, 实计这种方式无意义,本质上set中没有索引
(4) c.back() 得到最后一个元素, 有异常
(5) c.front() 得到第一个元素, 有异常
6、加入与删除元素
c.insert(值)
c.clear();删除所有元素
c.erase(值); 根据值删除元素
c.erase(it); 根据迭代器删除元素
7、加入自定义对象
内部不能有重复的元素, 并且要自动排序,所以加入自定义类的对象就会失败,除非类满足条件:重写三个函数,函数要求是const函数, 即重写
六、map/multmap
1、创建
2、加入
(1)只有加入,没有前后或中间插入,因为它会根据键自动排序,并且,键是不可重复的。
(2)"键"是有要求的,只能是char, short,int,long,float,double,string, 如果要把对象当作键,则要求与set中的对象的要求相同,一般不适用。
(3)加入的方式有两种,功能相同, 因为键不可重复,所以加入时,如果其中已经有同名的键,则加入不会生效。但没有异常
3、迭代器
(1)创建迭代器变量
(2)得到迭代器值
(3) 迭代器的运算
4、遍历
5、获取
it->first
it->second
6、修改 it->second=值
只能改值,不能改键
7、删除 m.erase(it),
根据迭代器删除
二、结构体
C++结构体与C++中类的唯一区别是:
1)、结构体权限修饰符默认为public。
2)、类中的权限修饰符默认为private