C++ ───List的使用

目录

1.1 list的介绍

1.2 list的使用

1.2.1 list的构造

1.2.2 list iterator的使用

1.2.3 list capacity

1.2.4 list element access

1.2.5 list modifiers

1.2.6 list的迭代器失效


扫描二维码关注公众号,回复: 17431854 查看本文章

1.1 list的介绍

        1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

        2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素

        3. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。

        4.list没有operator[] 

        list的主流访问方式是list< T>:: iterator(不支持减,不是随机迭代器,是双向迭代器),不支持算法库中的sort,自己支持了list::sort()
        但是list.sort()效率不高,如果在list有大量数据需要排序,通常使用将数据拷贝到vector,在vector中用算法库中的sort(iterator1 , iterator2)排序。

list<int> lt1={1,2,3,7,5,4};
lt1.sort();//排升序

lt1.sort(greater<int>());//排降序
先排序,后去重
lt1.unipue();//去重


拷贝到vector
vector<int>  v1(lt1.begin() , lt1.end());
sort(v1.begin() ,v1.end());
拷贝回list
lt2.assign(v1.begin() ,v1.end());

1.2 list的使用

        list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展 的能力。以下为list中一些常见的重要接口

1.2.1 list的构造

1.2.2 list iterator的使用

        此处,大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点。在后续List的实现部分会详细讲解list iterator 的实质与实现。

【注意】

1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动

2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

1.2.3 list capacity

1.2.4 list element access

1.2.5 list modifiers

list中还有一些操作,需要用到时大家可参阅list的文档说明

1.2.6 list的迭代器失效

        前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的只有在删除时才会失效并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

​
void TestListIterator1()
{
     int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
     list<int> l(array, array+sizeof(array)/sizeof(array[0]));
 
     auto it = l.begin();
     while (it != l.end())
     {
         // erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给
    其赋值
         l.erase(it); 
         ++it;
     }
}

// 改正
void TestListIterator()
{
     int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
     list<int> l(array, array+sizeof(array)/sizeof(array[0]));
 
     auto it = l.begin();
     while (it != l.end())
     {
         l.erase(it++); // it = l.erase(it);
     }
}

​

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助

欢迎各位点赞,收藏和关注哦

如果有疑问或有不同见解,欢迎在评论区留言哦

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

猜你喜欢

转载自blog.csdn.net/m0_73751295/article/details/140508998