c++之stl_list

c++之stl_list

一、list的内存结构

在cpp中,list容器是双向链表,对应c#中的LinkedList。链表的内存是不连续的,通过节点(node)串起来。

  1. 优点:
    • 高效插入删除。只需对指针进行操作,不需要拷贝元素。
    • 不需要连续内存,就可以完成动态操作。增加元素,即增加节点。
  2. 缺点:
    • 不支持随机访问,即索引器,[]操作符。
    • 需要额外内存来维护node节点。

接下来看看list是怎样设计的。

在这里插入图片描述

从图中可以看出,list不仅是双向的,还是环状的。整个list是由node串起来的,node里有两根指针,prev、next,以及一个data。prev指向前一个node,next指向后一个node。end()里没有data,这是为了遵循前闭后开原则,stl里其他容器也是一样。

二、具体实现

1. list的node

    template <typename T>
    struct list_node
    {
   
        typedef list_node<T> *node_ptr;
        typedef T value_type;

        value_type data;
        node_ptr prev;
        node_ptr next;

        list_node(const value_type &val) : data(val), prev(NULL), next(NULL) {
   }
    };

2. list的迭代器

    template <typename T>
    struct list_iterator {
   
        list_node<T> node;
        //......
        ref operator*() const {
   return node->data;}
        ptr operator->() const {
   return &(operator*());}
        self &operator++(){
   node = node->next; return *this;}
        self &operator--(){
   node = node->prev; return *this}
        bool &operator==(cosnt self &ths){
   return node == ths.node};
        //......
    };
    struct reverse_list_iterator {
   /* ..... */};
由于list的内存空间不连续,无法直接使用指针操作,所以必须重载++、--操作符,且不提供[]操作符。++操作其实就是将迭代器中的node指向下一个node,很容易理解。为了让迭代器能像指针一样使用,需要对*、->操作符进行重载,使其能够轻松获取到node中的data。操作符重载是cpp重要的一部分,虽然设计起来比较麻烦,但是能够让使用者用得很舒服。

3. list的常用方法

    void push_back(const value_type &val);//后端插入
    void push_front(const value_type &val);//前端插入
    void insert(iterator positon, const value_type &val);//任意一个位置插入
    void pop_front();//前端删除
    void pop_back();//后端删除
    void remove(const value_type &val);//删除所有指定元素
    iterator earse(iterator position);//删除任意一个节点
    void clear();//清空容器
list只需要一根node指针,一般称作为head(里面不装data,仅作为标记使用,为了遵循前闭后开区间的原则),配合iterator,就可以管理整个链表。操作list、iterator中的node指针,可以很快、很轻松的完成插入删除、操作。

在这里插入图片描述

4. 完整代码

为了保证简洁,可以忽略reverse iterator部分,本文reverse iterator的实现不妥,应采用迭代器适配器(iterator adaptor)来实现。

    #if !defined(_M_LIST_)
    #define _M_LIST_

    #include <memory>

    namespace learnCpp
    {
   
    template <typename T>
    struct list_node
    {
   
        typedef list_node<T> *node_ptr;
        typedef T value_type;

    public:
        value_type data;
        node_ptr prev;
        node_ptr next;

        list_node() : prev(NULL), next(NULL) {
   }
        list_node(const value_type &val) : data(val), prev(NULL), next(NULL) {
   }
    };

    template <typename T>
    struct list_iterator
    {
   
    protected:
        typedef T value_type;
        typedef T *ptr;
        typedef T &ref;
        typedef list_iterator<T> self;
        typedef list_node<T> *link_type;

    public:
        link_type node;

        list_iterator(link_type node 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ STL中的priority_queue是一个优先队列,它是一个使用堆来实现的容器。它可以按照一定的优先级顺序存储元素,并且每次访问队首元素都是访问优先级最高的元素。 在使用priority_queue时,可以通过定义不同的比较函数来指定元素的优先级顺序。默认情况下,对于基本类型,默认是大顶堆,降序队列。也可以通过指定参数来实现小顶堆,升序队列。例如: priority_queue<int, vector<int>, greater<int>> q; //小顶堆,升序队列 priority_queue<int, vector<int>, less<int>> q; //大顶堆,降序队列 在对priority_queue进行操作时,可以使用push()函数向队列中插入元素,使用top()函数获取队首元素,使用pop()函数删除队首元素。 在自定义类型的优先队列中,可以重载运算符>或<来定义优先级。例如,可以重载operator>来定义小顶堆,即优先级较小的元素排在前面。示例代码如下: struct Node{ int x, y; Node(int a=0, int b=0): x(a), y(b) {} }; bool operator> (Node a, Node b){ if(a.x == b.x) return a.y > b.y; return a.x > b.x; } priority_queue<Node, vector<Node>, greater<Node>> q; q.push(Node(rand(), rand())); while(!q.empty()){ cout<<q.top().x<<' '<<q.top().y<<endl; q.pop(); } 总结来说,C++ STL中的priority_queue是一个使用堆实现的优先队列,可以按照指定的优先级顺序存储元素。可以通过定义不同的比较函数或重载运算符来指定优先级规则。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【总结】C++ 基础数据结构 —— STL之优先队列(priority_queue) 用法详解](https://blog.csdn.net/weixin_44668898/article/details/102132580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值