STL顺序容器 list
双向列表容器(list):从任何地方快速插入与删除
1. 遍历数组
1.1 使用迭代器
链表不支持随机访问(下标访问),因为没有重载
所以只能通过迭代器进行访问
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main(){
// 链表,迭代器遍历
list<int> li = {1,4,5,6,8};
for(auto it = li.begin();it != li.end();++it){
cout << *it << " ";
}
cout << endl;
// li.remove(5); // 删除元素5
// 基于范围的for循环
for(auto n: li){
cout << n << " ";
}
cout << endl;
}
结果为:
1 4 5 6 8
1 4 5 6 8
1.2 删除操作
两种删除方法:
- 对指定值删除 remove
- 用迭代器的方法删除 erase
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main(){
// 链表,迭代器遍历
list<int> li = {1,4,5,6,8};
for(auto it = li.begin();it != li.end();++it){
cout << *it << " ";
}
cout << endl;
// li.remove(5); // 删除元素5
auto list_it = li.begin(); // 指向开头
++list_it; // 指向第二个
li.erase(list_it); // 擦除
// 基于范围的for循环
for(auto n: li){
cout << n << " ";
}
cout << endl;
}
这里的
auto list_it
是list<int>::iterator list_it
结果为:
1 4 5 6 8
1 5 6 8
对于学生管理系统中的删除学生信息
数据结构 list 在使用 erase 擦除时:
// 删除学生信息
bool Delete(const string& name){
list<Student>::iterator it = list.begin();
while(it != list.end()){
if(it->GetName() == name){
break;
}
++it;
}
if(it != list.end()) {
list.erase(it);
return true;
}
return false;
}
数据结构 vector 在使用 erase 擦除时,对上例直接改名字即可
1.3 顺序容器操作
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main(){
vector<int> vec = {1,2,3,4,5,6};
// 删除范围数据,结果为1,2,5,6
auto it = vec.begin();
vec.erase(it+2,it+4); // [it+2,it+4) 半开半闭,删除了3 4
// 打印出来
for(auto n:vec){
cout << n << " ";
}
cout << endl;
// 逆序迭代,结果为6,5,2,1
for(auto rit = vec.rbegin();rit!=vec.rend();++rit){
cout << *rit << " ";
}
cout << endl;
// 插入,结果为100,100,100,1,2,5,6
vec.insert(vec.begin(),3,100); // 首位插入3个100
for(auto n:vec){
cout << n << " ";
}
cout << endl;
// vector型复制为list型
list<int> li(vec.begin(),vec.end());
li.insert(li.begin(),200); // 插入,结果为200,100,100,100,1,2,5,6
for(auto n:li){
cout << n << " ";
}
cout << endl;
// 排序,结果为1,2,5,6,100,100,100,200
li.sort();
for(auto n:li){
cout << n << " ";
}
cout << endl;
// 补充:
// list<int> li(vec.begin(),vec.begin()+3); // 只要vec的前三个数据
// list<int> li(5,6); // 构造5个6
}
结果为:
1 2 5 6
6 5 2 1
100 100 100 1 2 5 6
200 100 100 100 1 2 5 6
1 2 5 6 100 100 100 200