链表
在存储结构上,数据结构的存储方式可以分为线性存储和链式存储。
- 线性存储:增删改查操作的空间,在存储介质上,是一段连续的空间,数组就是典型的线性存储。
- 链式存储:数据结构相关的空间,可以不连续。
vector是线性存储,优点是可以支持随机访问,缺点是空间必须提前分配,容易造成资源浪费,或是当释放原有空间时,会造成效率损耗。
链式存储方式就不一样,它可以完全按照需求,每需要存储一个元素,就精确地申请一块空间。如下图所示:
但是由于申请的空间时不连续的,所以会在每一块空间上设置指向上一个和下一个空间的指针。
STL中对list的使用
list在STL中叫做“链表”,采用的就是链式存储。也可以对其进行增删改查。
list中添加元素
insert:往链表中的任意位置插入元素,并且会返回一个迭代器,指向新插入的元素
#include "stdafx.h"
#include<iostream>
#include<list>
using namespace std;
int main(int argc, char* argv[])
{
list<int> mylist;
mylist.push_back(10);
mylist.push_back(20);
mylist.push_back(30);
mylist.push_back(40);
//迭代器遍历
for (auto it = mylist.begin();
it != mylist.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//(在任意位置)插入元素
for (auto it = mylist.begin();
it != mylist.end(); it++)
{
if (*it == 20)
{
it = mylist.insert(it, 100);
cout << *it << " ";//打印100
it++;
cout << *it << " ";//打印20
continue;
}
cout << *it << " "; //打印非20的所有
}
cout << endl;
return 0;
}
运行结果如下:
list中删除元素
erase:删除任意位置的元素,并且返回被删除的元素的后一项。
#include "stdafx.h"
#include<iostream>
#include<list>
using namespace std;
int main(int argc, char* argv[])
{
list<int> mylist;
mylist.push_back(10);
mylist.push_back(20);
mylist.push_back(30);
mylist.push_back(40);
//迭代器遍历
for (auto it = mylist.begin();
it != mylist.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//(在任意位置)删除元素
for (auto it = mylist.begin();
it != mylist.end(); it++)
{
if (*it == 20)
{
it = mylist.erase(it);
}
cout << *it << " ";
}
cout << endl;
return 0;
}
运行结果如下: