一、 List简介
STL中的list就是一双向链表,因此它的内存空间是可以不连续的,通过指针来进行数据的访问,这使list的随机存储变得非常低效,list不支持随机访问,就是没有 at()函数和[]操作符。但是list可以很好地支持任意地方的插入和删除,只需移动相应的指针即可,可高效地进行插入删除元素。
总之,如果你需要大量的插入和删除,而不关心随即存取,则应使用list。
二、 List的构造函数
list<int> L0; | 空链表 |
list<int> L1(9); | 建一个含个默认值是的元素的链表 |
list<int> L2(5,1); | 建一个含个元素的链表,值都是 |
list<int> L3(L2); | 建一个L2的copy链表 |
list<int> L4(L0.begin(), L0.end()); | 建一个含L0一个区域的元素 |
三、 List用法代码实现
#include "stdafx.h"
#include <list>
#include <iostream>
using namespace std;
static int LENGTH = 5;
typedef struct MsgData
{
int n_Port;
char* p_Msg;
}DATA_ST;
// 遍历list并打印出来
void showList(list<int> v_List)
{
for (list<int>::iterator iter = v_List.begin(); iter != v_List.end(); iter++)
{
cout << *iter << " ";
}
cout << "\n";
}
// 判断list是否为空
bool isEmpty(list<int> v_List)
{
if (v_List.empty())
{
return true;
}
else
{
return false;
}
}
// 根据给的值来遍历删除list中的值,记住要传引用,不然删除不成功
void deleteElementByValue(list<int>& v_List,int value)
{
// 这样写防止出现没有值得时候iter错误
for (list<int>::iterator iter = v_List.begin(); iter != v_List.end();)
{
if (*iter == value)
{
iter = v_List.erase(iter);
cout << "Delete value " << value << " success. \n" ;
}
else
{
iter++;
}
}
}
int main()
{
/*// 存储Struct的list
list<DATA_ST> listST;
DATA_ST msgData;
msgData.n_Port = 8096;
msgData.p_Msg = "Pwrd";
listST.push_back(msgData);*/
// 存储int类型的list
list<int> listN;
list<int>::iterator iter;
iter = listN.begin();
// 从list的结尾插值
listN.push_back(2);
// 从list的开头插入值
listN.push_front(1);
// 在指定的iterator处插入值
do
{
LENGTH++;
listN.push_back(LENGTH);
} while (LENGTH != 10);
/*// 把LENGTH个元素LENGTH赋值给listN链表,原有的值会被覆盖s
listN.assign(LENGTH, LENGTH);
// 指定位置插入值
//listN.insert(iter, LENGTH);*/
showList(listN);
deleteElementByValue(listN,6);
/*// 相当于上面函数的功能
listN.remove(6);*/
// 反转list
listN.reverse();
showList(listN);
/*// 清除第一个元素
listN.pop_front();
// 清除最后一个元素
listN.pop_back();
// 清空
listN.clear();*/
system("pause");
return 0xABCD;
}
四、 List常用函数
List常用函数 | 说明 |
constructor | 构造函数 |
destructor | 析构函数 |
operator= | 赋值重载运算符 |
assign | 分配值 |
front | 返回第一个元素的引用 |
back | 返回最后一元素的引用 |
begin | 返回第一个元素的指针(iterator) |
end | 返回最后一个元素的下一位置的指针 |
rbegin | 返回链表最后一元素的后向指针(reverse_iterator or const) |
rend | 返回链表第一元素的下一位置的后向指针 |
push_back | 增加一元素到链表尾 |
push_front | 增加一元素到链表头 |
pop_back | pop_back()删除链表尾的一个元素 |
pop_front | 删除链表头的一元素 |
clear | 删除所有元素 |
erase | 删除一个元素或一个区域的元素(两个重载) |
remove | 删除链表中匹配值的元素(匹配元素全部删除) |
remove_if | 删除条件满足的元素(遍历一次链表),参数为自定义的回调函数 |
empty | 判断是否链表为空 |
max_size | 返回链表最大可能长度 |
size | 返回链表中元素个数 |
resize | 重新定义链表长度(两重载函数) |
reverse | 反转链表 |
sort | 对链表排序,默认升序 |
merge | 合并两个有序链表并使之有序 |
splice | 对两个链表进行结合(三个重载函数) 结合后第二个链表清空 |
insert | 在指定位置插入一个或多个元素(三个重载函数) |
swap | 交换两个链表(两个重载) |
unique | 删除相邻重复元素 |