STL:STL顺序容器 list

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 删除操作

两种删除方法:

  1. 对指定值删除 remove
  2. 用迭代器的方法删除 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_itlist<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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值