zoukankan      html  css  js  c++  java
  • QLinkedList和std::forward_list

    forward_list

    forward_list是C++11版本才有的。forward_list被实现为单链表,而list是一个双向链表,所以forward_list要比list高效一些。forward_list设计的时候就是追求效率的,跟我们自己写的C格式的单链表一样的高效。

    考虑到效率问题,forward_list没有size成员函数。由于它本质是一个链表,有一个size成员会耗费常量的时间来计数其大小。这将需要一些额外的空间而且会降低插入和删除操作的效率。如果要获得forward_list 的大小,可以对begin和end调用distance算法操作。

    forward_list 的大部分操作还是跟list差不多的,这里就简单看一些不一样的操作:

    迭代器:

    List是双向链表,所以有反向迭代器;而forward_list就没有反向迭代器。但是比list多了两种迭代器:

     iterator before_begin() noexcept;

    const_iterator before_begin() const noexcept;

     

    const_iterator cbefore_begin() const noexcept;

    这两种迭代器指向第一个元素之前的位置,所以不能解引用。它可以用做emplace_afterinsert_aftererase_after or splice_after的参数。

    添加删除元素的操作:

    template <class... Args> void emplace_front (Args&&... args);

    在链表头节点的前面插入一个节点,新节点是用args做参数构造出来的。

    void push_front (const value_type& val);
    void push_front (value_type&& val);
    在链表头节点的前面插入一个节点,但是与emplace_front不同的地方就是节点是通过拷贝或者转移了val的。
    template <class... Args>   iterator emplace_after (const_iterator position, Args&&... args);
     
    iterator insert_after ( const_iterator position, const value_type& val );
    iterator insert_after ( const_iterator position, value_type&& val );
    iterator insert_after ( const_iterator position, size_type n, const value_type& val );
    template <class InputIterator>  iterator insert_after ( const_iterator position, InputIterator first, InputIterator last );
    iterator insert_after ( const_iterator position, initializer_list<value_type> il );

    在position之后插入新节点

    iterator erase_after (const_iterator position);  
    iterator erase_after (const_iterator position, const_iterator last);

    删除position位置的节点

    void pop_front();

    删除第一个节点

    因为forward_list是单链表,为了能跟list有想通的功能,所以就需要before_begin迭代器,使得可以在头节点之前插入新节点。

    其他的函数都跟list的差不多,这里就不重复了。需要记住的就是forward_list没有size成员函数。需要自己计算获取其大小。

     

     

     

     

     

     

     

    QLinkedList

    QLinkedList才是Qt真正意义上的链表。QLinkedList实际上跟std::list是一样的,也是双向链表。QList实际内部还是一个指针数组。QLinkedList提供的函数大部分还是跟QList一样的,下面我们就看一些不同的地方。

     

    int QLinkedList::size () const

    返回链表的大小,即节点个数。而forward_list没有这个函数。

     

    const_iterator QList::constBegin () const

    const_iterator QList::constEnd () const

    这是QList返回STL风格的迭代器。QLinkedList则没有提供这样的函数。

     

    void QList::append ( const T & value )

    void QList::append ( const QList<T> & value )

     

    void QLinkedList::append ( const T & value )

    QLinkedList 没有接受一个QLinkedList 参数的append函数。

     

    最重要的区别就是:

    QLinkedList没有 T &

    operator[] ( int i )

    链表是肯定不能支持索引操作的。

    所以QList提供的所有基于索引的操作,QLinkedList都是不可能支持的,比如:

    const T &

    at ( int i ) const

    void

    insert ( int i, const T & value )

    void

    move ( int from, int to )

    void

    replace ( int i, const T & value )

    T

    takeAt ( int i )

    void

    swap ( int i, int j )

    可能还有其他函数,这里就不一一列举了。

    QLinkedList提供了与std::list的转换函数:

    QLinkedList<T>

    fromStdList ( const std::list<T> & list )

    std::list<T>QLinkedList::toStdList () const

    需要记住的一点:Qt容器是隐式共享的。QLinkedList自然也是支持隐式共享的。

     

  • 相关阅读:
    12.2 ROS NavFn全局规划源码解读_2
    12.1 ROS NavFn全局规划源码_1
    12 ROS Movebase主体源码解读
    11 ROS 动态参数调节
    10. ROS costmap代价地图
    无人驾驶汽车1: 基于Frenet优化轨迹的无人车动作规划方法
    VC下加载JPG/GIF/PNG图片的两种方法
    vc++加载透明png图片方法-GDI+和CImage两种
    供CImage类显示的半透明PNG文件处理方法
    使用MFC CImage类绘制PNG图片时遇到的问题
  • 原文地址:https://www.cnblogs.com/riskyer/p/3327529.html
Copyright © 2011-2022 走看看