本篇文章之所以诞生,是由于在刷PAT时需要掌握STL模板库,所以特意测试学习了常用的方法。仅适用于G++环境下的单线程单文档情况。对于多文档多线程情况不保证正确性。如果你是只想在数据结构与算法比赛中多拿一些AC而学习STL,小码农自认它还是挺好的。如果是项目需要而学习STL,还是建议读官方文档。
如果你觉得博文状态下阅读费劲,可以去我的github下载源码。如果出现对不齐的情况,把编辑器Tab键缩进设置成4个就可以了。欢迎指点评论。
#include <bits/stdc++.h>
using namespace std;
/*
下面的注释:
1)DT : data type
2)遍历说明:以集合名开头的都是遍历本次测试使用到的集合的结果,
由于太多cout会使调理不清晰,便直接放上输出结果。
*/
bool cmp(int e1, int e2){ return e1 > e2; }
int main()
{
/*
1、创建:
1)默认创建: list<DT> l;
2)拷贝创建: list<DT> l(ano);
3)根据list的一部分创建: list<DT> l(iterator1, iterator2);
4)创建时初始化size为n: list<DT> l(n);
测试得到的初始值: int -> 0; char -> 0(ASCII);
double -> 0; float -> 0;
string -> ""; bool -> false;
5)创建时初始化size为n,数据为m: list<DT> l(n, m);
*/
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
list<int> l1;
list<int> l3(&arr[3], &arr[8]);
list<int> l2(l3);
list<int> l4(10);
list<int> l5(10, 8);
/*Console: l1:
l2: 4 5 6 7 8
l3: 4 5 6 7 8
l4: 0 0 0 0 0 0 0 0 0 0
l5: 8 8 8 8 8 8 8 8 8 8 */
/*
2、插入:
1)尾部插入: void push_back();
2)头部插入: void push_front();
3)插入迭代器指向的位置的后面: iterator insert(iterator it, DT data);
*/
l1.push_back(9);
l1.push_front(1);
l1.insert(l1.begin(), 0);
/*Console: l1:0 1 9 */
/*
3、删除:
1)尾部删除: void pop_back();
2)头部删除: void pop_front();
3)删除迭代器指向的位置: iterator erase(iterator it);
4)删除容器中所有元素等于x的元素: void remove(DT data);
5)清空: void clear();
*/
l2.pop_back();
l2.pop_back();
l2.erase(l2.begin());
l2.push_back(5);
l2.remove(5);
/*Console: l2:6 */
/*
4、遍历:
1)使用迭代器: for(list<DT>::iterator it = l.begin(); it != l.end(); it++)
*/
for(list<int>::iterator it = l1.begin(); it != l1.end(); it++)
cout << *it << " ";
cout << endl;
/*
5、获得元素
1)获得头元素的拷贝: DT front();
2)获得尾元素的拷贝: DT back();
3)获得指向头元素之前的迭代器: iterator begin();
4)获得指向尾元素之后的迭代器: iterator end();
*/
int f5 = l1.front(), b5 = l1.back();
cout << f5 << " " << b5 << endl;
list<int>::iterator it51 = l1.begin();
list<int>::iterator it52 = l1.end();
it52--;
cout << *it51 << " " << *it52 << endl;
/*Console: 0 9
0 9 */
/*
6、排序
1)默认排序: void sort();
2)自定义排序: void sort(cmp);
*/
l5.push_front(10);
l5.sort();
/*Console: l5:8 8 8 8 8 8 8 8 8 8 10 */
l5.sort(cmp);
/*Console: l5:10 8 8 8 8 8 8 8 8 8 8 */
/*
7、其他:
1)反转: void reverse();
2)合并: void merge(list<DT> &ano);
ano按顺序插在this集合之后,合并后被合并集合的被置空
3)交换: void swap(list<DT> &ano);
*/
l5.reverse();
/*Console: l5:8 8 8 8 8 8 8 8 8 8 10 */
l3.merge(l5);
/*Console: l5:4 5 6 7 8 8 8 8 8 8 8 8 8 8 8 10 */
/*
8、其他:
1)判断是否为空: void empty();
2)集合中元素个数 void size();
*/
cout << l5.size() << " " << l5.empty() << endl;
/*Console: 0 1 */
return 0;
}