一, STL大纲
首先我们知道 STL 的设置的初衷,当我们程序猿在实现一些程序的时候,我们可能会重复的使用到一些数据结构,还有算法,我们所要说的stl就是被使用很多次的数据结构,我们把他分装到STL中,然后调用,这会使我们能更方便的来完成数据结构的实现,以及程序的设计
常见的STL容器有:
LIST 双链表 , VECTOR 动态数组 ,QUEUE 队列 ,STACK 栈。。。
二,LIST 双链表容器
1, 数据结构的存储结构
双链表容器,存储的方式就是类似双链表的存储,使用的时候就把这个链表结构当成常用的链表使用就行,
2,lIst 的使用
1,链表的创建
创建一个空表 : list <数据结构> 变量名称
创建一个常数链表 :list <> name( 几个 ,常数值) ;
创建一个导其他类型的数据结构链表: list <> na (na2)
其他使用迭代器导入
//数组迭代器
#include <iostream>
#include <list>
using namespace std ;
int main ()
{
int q[10] = {
1,2,3,45,6,7,8,9,3} ;
list <int> sq(q , q + 10) ;
for(int e : sq)
{
cout << e << endl ;
}
return 0 ;
}
2,链表的压入,删除基础操作
∗ ∗ 链表的压入 ∗ ∗ **链表的压入** ∗∗链表的压入∗∗
头压入 : name.push_front()
尾压入 : name.push_back()
#include <iostream>
#include <list>
using namespace std ;
int main ()
{
int q[10] = {
1,2,3,45,6,7,8,9,3} ;
list <int> sq(q , q + 10) ;
sq.push_back(1314);//back
sq.push_front( 34);
//front
for(int e : sq)
{
cout << e << endl ;
}
return 0 ;
}
∗ ∗ 链表的弹出 ∗ ∗ **链表的弹出** ∗∗链表的弹出∗∗
头弹出 : pop_front ()
尾弹出 : pop_back ()
#include <iostream>
#include <list>
using namespace std ;
int main ()
{
int q[10] = {
1,2,3,45,6,7,8,9,3, 34} ;
list <int> sq(q , q + 10) ;
sq.push_back(1314);
sq.push_front( 34);
sq.pop_back() ;
sq.pop_front() ;
sq.pop_back() ;
for(int e : sq)
{
cout << e << endl ;
}
return 0 ;
}
剩下的操作都需要一个迭代器的操作,接下我们i先补习一下迭代器的操作。
迭代器:
针对list 链表迭代器的实现
常见的 c.begin() ,c.end() 一个头节点,一个尾结点
——————————————————————————————————————
中间迭代器的查找操作 :
使用迭代器遍历存储 list < > :: iterator
寻找地址: 使用ffind 函数 ( 前结点, 后结点 ,值)
∗ ∗ 链表的插入 ∗ ∗ **链表的插入** ∗∗链表的插入∗∗
#include <iostream>
#include <list>
#include <bits/stdc++.h>
using namespace std ;
int main ()
{
int q[10] = {
1,2,3,45,6,7,8,9,3, 34} ;
list <int> sq(q , q + 10) ;
sq.push_back(1314);
sq.push_front( 34);
sq.pop_back() ;
sq.pop_front() ;
sq.pop_back() ;
list<int> :: iterator pos = find(sq.begin() , sq.end() , 2) ;
//指针的存储 iterator
sq.insert(pos, 2324) ;
//压入操作
for(int e : sq)
{
cout << e << endl ;
}
return 0 ;
}
∗ ∗ 链表的删除 ∗ ∗ **链表的删除** ∗∗链表的删除∗∗
#include <iostream>
#include <list>
#include <bits/stdc++.h>
using namespace std ;
int main ()
{
int q[10] = {
1,2,3,45,6,7,8,9,3, 34} ;
list <int> sq(q , q + 10) ;
sq.push_back(1314);
sq.push_front( 34);
sq.pop_back() ;
sq.pop_front() ;
sq.pop_back() ;
list<int> :: iterator pos = find(sq.begin() , sq.end() , 2) ;
sq.insert(pos, 2324) ;
sq.erase(pos) ;
for(int e : sq)
{
cout << e << endl ;
}
return 0 ;
}
扩展
对STL迭代器的一些想法和理解 首先来说迭代器是这个值的内存地址,在数据结构中我们锁定的就是这个结点,不是这个结点所在的位置 。
∗ ∗ 链表数据的获取 ∗ ∗ **链表数据的获取** ∗∗链表数据的获取∗∗
首先获取数据的时候,头部的获取:front() 尾部的获取 back()
3,常用的经典操作
链表的大小
cout << sq.size() << endl ;
和sort() 函数的使用
lt.sort()
删除指定元素 remove()
lt.remove()
3,链表的遍历
#include <iostream>
#include <list>
using namespace std ;
int main ()
{
int q[10] = {
32,34,3,534,5,4,65,4,65,6} ;
list <int> li(q, q + 9) ;
for( auto e : li)
cout << e << endl ;
return 0 ;
}
这种遍历方式是几个数据结构特有的