[C++]C++ vector和list的区别

  • list是由双向链表实现的,内存空间是不连续的。由链表的实现原理可知:
    • 优点:插入和删除效率较高。只需要在插入的地方更改指针的指向即可,不用移动数据。
    • 缺点:List查询效率较低,时间复杂度为O(n)

  • vector拥有一段连续的内存空间,并且起始地址不变,与数组类似:
    • 优点:便于随机访问,时间复杂度为O(1),
    • 缺点:因为内存空间是连续的,所以在进入插入和删除操作时,会造成内存块的拷贝,时间复杂度为O(n)。

迭代方法

  • list的iterator不支持 +、+=、<等操作,vector支持;
  • vector<int>::iteratorlist<int>::iterator都重载了++操作;

list几种迭代方法

迭代器

第1种

list<int> int_l;          //声明一个list
for(int i=0;i<10;i++){
    int_l.push_back(i);
}
list<int>::iterator iter; //声明一个迭代器
for(iter = int_l.begin();iter!=int_l.end();itet++){
    cout <<"打印:"<< *iter <<endl;
}

第2种

list<int> int_l;          //声明一个list
for(int i=0;i<10;i++){
    int_l.push_back(i);
}
list<int>::iterator iter; //声明一个迭代器
for(int iter:int_l){
    cout <<"打印:"<< *iter <<endl;
}

附录

list常用函数

//1. list中的构造函数:================

list() //声明一个空列表;

list(n) //声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的

list(n,val) //声明一个由n个元素的列表,每个元素都是由其复制构造函数T(val)得来的

list(n,val) //声明一个和上面一样的列表

list(first,last) //声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素

//1. list中的操作:================
begin()和end();//通过调用list容器的成员函数begin()得到一个指向容器起始位置的iterator,可以调用list容器的 end() 函数来得到list末端下一位置,相当于:int a[n]中的第n+1个位置a[n],实际上是不存在的,不能访问,经常作为循环结束判断结束条件使用。

push_back() 和push_front();//使用list的成员函数push_back和push_front插入一个元素到list中。其中push_back()从list的末端插入,而 push_front()实现的从list的头部插入。

empty();//利用empty() //判断list是否为空。

resize();如果调用resize(n)将list的长度改为只容纳n个元素,超出的元素将被删除,如果需要扩展那么调用默认构造函数T()将元素加到list末端。如果调用resize(n,val),则扩展元素要调用构造函数T(val)函数进行元素构造,其余部分相同。

clear();//清空list中的所有元素。

front()和back(); //通过front()可以获得list容器中的头部元素,通过back()可以获得list容器的最后一个元素。但是有一点要注意,就是list中元素是空的时候,这时候调用front()和back()会发生什么呢?实际上会发生不能正常读取数据的情况,但是这并不报错,那我们编程序时就要注意了,个人觉得在使用之前最好先调用empty()函数判断list是否为空。

pop_back和pop_front()//通过删除最后一个元素,通过pop_front()删除第一个元素;序列必须不为空,如果当list为空的时候调用pop_back()和pop_front()会使程序崩掉。

assign();//具体和vector中的操作类似,也是有两种情况,第一种是:l1.assign(n,val)将 l1中元素变为n个T(val)。第二种情况是:l1.assign(l2.begin(),l2.end())将l2中的从l2.begin()到l2.end()之间的数值赋值给l1。

swap();//交换两个链表(两个重载),一个是l1.swap(l2); 另外一个是swap(l1,l2),都可能完成连个链表的交换。

reverse()//通过reverse()完成list的逆置。

merge();//合并两个链表并使之默认升序(也可改),l1.merge(l2,greater<int>()); 调用结束后l2变为空,l1中元素包含原来l1 和 l2中的元素,并且排好序,升序。其实默认是升序,greater<int>()可以省略,另外greater<int>()是可以变的,也可以不按升序排列。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被代码搞废的挖掘机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值