一、标准模板库STL
STL具有六大组件:容器、迭代器、算法、容器适配器、空间适配器、仿函数
二、容器
容器分为两个类:序列性容器和关联性容器
1.序列性容器:元素保持在容器中原始的位置,允许指定插入元素的位置,元素的位置取决于插入的时间和地点,与元素的值无关,例如list、vector、deque
2.关联性容器:元素的位置取决于容器特定的排序规则,与元素的值有关,例如map、set、hash_map
容器使用时会自动new、delete,不需要手动干预
2.1 list
链式结构,便于插入和删除
插入删除的时间复杂度为O(1);查找的时间复杂度为O(n)
头文件:
#include<list>
list的使用
#include<iostream>
#include<list>
using namespace std;
int main()
{
list<int> lst;//空链表
list<int> lst2(3);//三个节点的链表,链表初始化默认值默认值为0
list<int> lst3(3, 2);//三个节点的链表,指定链表初始化值为2
return 0;
}
使用迭代器或者增强for循环进行遍历
list<int>::iterator ite = lst.begin();
list<int>::iterator ite2 = lst2.begin();
list<int>::iterator ite3 = lst3.begin();
while (ite2!=lst2.end())
{
cout << *ite2 << " ";
ite2++;
}
cout << endl;
for (int a : lst3)
{
cout << a << " ";
}
输出结果为
list<int> lst;
lst.push_back(8);//push_back(a)尾添加值a
lst.push_back(2);
lst.push_back(3);
lst.push_front(9);//push_front(a)头添加值a
lst.push_front(8);
lst.push_front(7);
list<int>::iterator ite = lst.begin();
while (ite!=lst.end())
{
cout << *ite << " ";
ite++;
}
cout << endl;
lst.remove(8);//remove(a)将所有值为a的节点删除
ite = lst.begin();
while (ite != lst.end())
{
cout << *ite << " ";
ite++;
}
cout << endl;
输出结果为:
list<int> lst;
lst.push_back(8);
lst.push_back(2);
lst.push_back(3);
lst.push_front(8);
lst.push_front(8);
lst.push_front(7);
lst.push_back(8);
list<int>::iterator ite = lst.begin();
while (ite!=lst.end())
{
cout << *ite << " ";
ite++;
}
cout << endl;
lst.unique();//将连续且相同的节点删除,只保留一个
ite = lst.begin();
while (ite != lst.end())
{
cout << *ite << " ";
ite++;
}
cout << endl;
输出结果为
list<int> lst;
lst.push_back(4);
lst.push_back(3);
lst.push_back(1);
lst.push_back(8);
list<int>::iterator ite = lst.begin();
while (ite!=lst.end())
{
cout << *ite << " ";
ite++;
}
cout << endl;
lst.sort();//对链表内的值进行排序,默认升序
ite = lst.begin();
while (ite != lst.end())
{
cout << *ite << " ";
ite++;
}
cout << endl;
输出结果为
如果需要降序,我们需要借助规则函数
bool rule1(int a, int b)
{
return a > b;
}
lst.sort(&rule1);
输出结果为
或者采用模板库提供的方法
lst.sort(greater<int>());//降序
输出为
lst.sort(less<int>());//升序
输出为
lst.sort(less<int>());//升序
ite = lst.begin();
while (ite != lst.end())
{
cout << *ite << " ";
ite++;
}
cout << endl;
lst.reverse();//翻转整个链表
ite = lst.begin();
while (ite != lst.end())
{
cout << *ite << " ";
ite++;
}
cout << endl;
输出结果为
list<int> lst1{ 1,2,3,4 };
list<int> lst2{ 9,8,7,6 };
lst1.splice(++lst1.begin(), lst2);//将lst2剪切到lst1的指定位置之前,并将lst2清空
for (int v : lst1)
cout << v << " ";
cout << endl;
for (int v : lst2)
cout << v << " ";
cout << endl;
cout << sizeof(lst2);
输出结果为
splice()是一个重载函数,还可以有如下使用方法
lst1.splice(++lst1.begin(), lst2,--lst2.end());//将lst2的最后一个节点剪切到lst1指定位置之前
输出结果为
lst1.splice(++lst1.begin(), lst2,++lst2.begin(),--lst2.end());//将lst2的左闭右开区间剪切到lst1指定位置之前
输出结果为
list<int>::iterator ite = lst1.begin();
::advance(ite, 2);//ite偏移
lst1.splice(lst1.begin(), lst1,ite,lst1.end());//剪切自身
for (int v : lst1)
cout << v << " ";
cout << endl;
输出结果为
list<int> lst1{ 3,2,1,4 };
list<int> lst2{ 9,6,7,8 };
lst1.sort();
lst2.sort();
lst1.merge(lst2);//将lst2合并(剪切)到lst1
for (int v : lst1)
cout << v << " ";
cout << endl;
for (int v : lst2)
cout << v << " ";
cout << endl;
cout << lst2.size()<<endl;
输出结果为
list<int> lst1{ 3,2,1,4 };
list<int> lst2{ 9,6,7,8 };
lst1.sort(greater<int>());
lst2.sort(greater<int>());
lst1.merge(lst2, greater<int>());//降序合并
for (int v : lst1)
cout << v << " ";
cout << endl;
for (int v : lst2)
cout << v << " ";
cout << endl;
cout << lst2.size()<<endl;
2.2 vector向量
vector相当于数组,可以根据需求自动扩展容量,在末尾存取是恒定的时间,在中间插入删除需要线性时间。
特点:使用下标访问元素更方便,插入删除比较影响效率
头文件:#include<vector>
但是在vector中我们要注意容量和使用量的区别
使用方法大致和list相似
不同之处过段时间补充