C++ vector和list的区别
- list是由双向链表实现的,内存空间是不连续的。由链表的实现原理可知:
- 优点:插入和删除效率较高。只需要在插入的地方更改指针的指向即可,不用移动数据。
- 缺点:List查询效率较低,时间复杂度为O(n)
- vector拥有一段连续的内存空间,并且起始地址不变,与数组类似:
- 优点:便于随机访问,时间复杂度为O(1),
- 缺点:因为内存空间是连续的,所以在进入插入和删除操作时,会造成内存块的拷贝,时间复杂度为O(n)。
迭代方法
- list的iterator不支持
等操作,vector支持;+、+=、<
-
和vector<int>::iterator
都重载了list<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;
}
vector
附录
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>()是可以变的,也可以不按升序排列。
若你对人工智能(CV/NLP)、C++/python编程、互联网就业及发展有兴趣,欢迎点赞关注和收藏。谢谢鼓励!!!
C++相关知识:
Anxjing.AI:C++ this_thread::sleep_forzhuanlan.zhihu.com
Anxjing.AI:C++ Lambda表达式zhuanlan.zhihu.com
Anxjing.AI:C++并发_condition_variablezhuanlan.zhihu.com
Anxjing.AI:生产者-消费者模型zhuanlan.zhihu.com
Anxjing.AI:C++预处理指令zhuanlan.zhihu.com
Anxjing.AI:C++工具:Cmakezhuanlan.zhihu.com
Anxjing.AI:SSH 学习zhuanlan.zhihu.com
Anxjing.AI:记录C++阶段性学习一zhuanlan.zhihu.com
Anxjing.AI:DesignPatterns C++:单例模式zhuanlan.zhihu.com
Anxjing.AI:C++基础:map简析zhuanlan.zhihu.com
Anxjing.AI:C++基础:memset函数简析zhuanlan.zhihu.com
Anxjing.AI:C++基础:break&continue区别zhuanlan.zhihu.com
Anxjing.AI:C++基础:指针和引用的区别zhuanlan.zhihu.com
Anxjing.AI:C++中::和:, .和->的作用和区别?zhuanlan.zhihu.com
Anxjing.AI:string中c_str()的使用方法和特性zhuanlan.zhihu.com
Anxjing.AI:C ++ strcpy()和strncpy()函数zhuanlan.zhihu.com
Anxjing.AI:C++基础-关键字virtualzhuanlan.zhihu.com
Anxjing.AI:C++基础-函数重载zhuanlan.zhihu.com
Anxjing.AI:C++基础-staticzhuanlan.zhihu.com
Anxjing.AI:C++基础:判断文件是否存在的方法zhuanlan.zhihu.com
Anxjing.AI:C++基础-strstr查找子串zhuanlan.zhihu.com
Anxjing.AI:C++基础:std::thread多线程zhuanlan.zhihu.com
Anxjing.AI:C++抽象类zhuanlan.zhihu.com