list容器链表
一、链表特性
(1) 链表是由一系列的结点组成,结点包含两个域,一个数据域,一个指针域。 (2) 链表内存是非连续的,因此添加或删除元素,时间复杂度都是常数项,不需要移动元素,比数组添加删除效率高。 (3) 链表只有在需要的时候,才分配内存。 (4) 链表,只要拿到第一个结点,相当于拿到整个链表。 (5) 链表需要额外的空间保存结点的关系:前驱、后继关系。
二、链表和数组区别:
(1) 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。 (2) 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据元素。(数组中插入、删除数据项时,需要移动其他数据项)
三、list容器(链表)各种操作
(1)操作函数释义:
sort 支持可随机访问的容器
(2)重点操作实例
#include<iostream>
#include<list>
using namespace std
;
void printlist(list
<int>& v
) {
for (list
<int>::iterator it
= v
.begin(); it
!= v
.end(); ++it
) {
cout
<< *it
<< " ";
}cout
<< endl
;
}
void test01() {
list
<int>mlist1
;
list
<int>mlist2(10, 10);
list
<int>mlist3(mlist2
);
list
<int>mlist4(mlist2
.begin(), mlist2
.end());
printlist(mlist4
);
}
void test02() {
list
<int>mlist
;
mlist
.push_back(100);
mlist
.push_front(200);
mlist
.push_front(200);
mlist
.push_front(200);
mlist
.insert(mlist
.begin(), 300);
mlist
.insert(mlist
.begin(), 200);
mlist
.insert(mlist
.end(), 400);
list
<int>::iterator it
= mlist
.begin();
it
++; it
++;
mlist
.insert(it
, 500);
printlist(mlist
);
mlist
.remove(200);
printlist(mlist
);
mlist
.pop_back();
mlist
.pop_front();
mlist
.erase(mlist
.begin(), mlist
.end());
printlist(mlist
);
}
void test03() {
list
<int>mlist
;
mlist
.assign(10, 10);
printlist(mlist
);
list
<int>mlist2
;
mlist2
= mlist
;
printlist(mlist2
);
list
<int>mlist3
;
mlist3
.assign(5, 8);
mlist
.swap(mlist3
);
printlist(mlist
);
printlist(mlist3
);
}
void test04() {
list
<int>mlist
;
for (int i
= 0; i
< 10; ++i
) {
mlist
.push_back(i
);
}
printlist(mlist
);
mlist
.reverse();
printlist(mlist
);
}
bool mycompare(int v1
, int v2
);
void test05() {
list
<int>mlist
;
mlist
.push_back(1);
mlist
.push_back(7);
mlist
.push_back(5);
mlist
.push_back(3);
printlist(mlist
);
mlist
.sort();
printlist(mlist
);
mlist
.sort(mycompare
);
printlist(mlist
);
}
bool mycompare(int v1
, int v2
) {
return v1
> v2
;
}
int main(void) {
test05();
return 0;
}
链表的功能还是十分强大,如果完全掌握了,不管是实现一些函数或者是我们在做面试题的时候都会让我们事半功倍,让代码看起来更简洁,逻辑表达更清晰。