List的使用
test.cpp
#include <iostream>
#include <list>
#include <vector>
using namespace std;
namespace std
{
void test_list1()
{
//初始化
list<int> lt1;
//10个5
list<int> lt2(10, 5);
//自己的迭代器来初始化
list<int> lt3(lt2.begin(), lt2.end());
//别的迭代器来初始化
vector<int> v = { 1, 2, 3, 4, 5 };
list<int> lt4(v.begin(), v.end());
//遍历--不支持[]因为物理空间不连续
list<int>::iterator it4 = lt4.begin();
while (it4 != lt4.end())
{
cout << *it4 << " ";
++it4;
}
cout << endl;
for (auto e : lt3)
{
cout << e << " ";
}
cout << endl;
//赋值--10个5变为5个3
lt3.assign(5, 3);
for (auto e : lt3)
{
cout << e << " ";
}
cout << endl;
}
void test_list2()
{
list<int> lt;
//尾插
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
//尾删
lt.push_front(10);
lt.push_front(20);
lt.push_front(30);
lt.push_front(40);
//尾插尾删很快--底层是带头双向循环的链表
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
//尾删
lt.pop_back();
lt.pop_back();
lt.pop_back();
lt.pop_back();
lt.pop_front();
lt.pop_back();
lt.pop_back();
lt.pop_back();
//lt.pop_back();
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
}
void test_list3()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
//因为没有fine
list<int>::iterator pos = find(lt.begin(), lt.end(), 2);
if (pos != lt.end())
{
lt.insert(pos, 20);
}
// 这里pos不会失效--2被改为100
cout << *pos << endl;
*pos = 100;
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
}
void test_list4()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
list<int>::iterator pos = find(lt.begin(), lt.end(), 2);
if (pos != lt.end())
{
lt.erase(pos);
}
// 这里pos会失效,因为pos指向的节点已经被释放了,出现野指针
cout << *pos << endl;
*pos = 100;
}
void test_list5()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
//清掉所有节点除了头结点
lt.clear();
//有头结点所以还可以继续插入数据
lt.push_back(10);
lt.push_back(20);
lt.push_back(30);
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
list<int> lt1;
lt1.push_back(100);
lt1.push_back(200);
// c++98,两个list的数据交换
lt.swap(lt1);
swap(lt, lt1);
}
void test_list6()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(2);
lt.push_back(3);
lt.push_back(30);
lt.push_back(2);
lt.push_back(4);
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
// > 降序 , < 升序
//默认升序
//it.sort();
//降序
//有名对象
//greater<int> g;
//lt.sort(g);
//匿名对象
lt.sort(greater<int>());
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
// 去重->前提要排序,排序完才能去掉重复的值
lt.unique();
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
//删除--有就删,无也可以运行
lt.remove(3);
lt.remove(5);
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
//逆置
lt.reverse();
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
}
void TestOP()
{
srand(time(0));
const int N = 100000;
list<int> lt;
vector<int> v;
//先开空间再push_back
v.resize(N);
for (int i = 0; i < N; ++i)
{
v[i] = rand();
lt.push_back(v[i]);
}
//vector的排序
int begin1 = clock();
sort(v.begin(), v.end());
int end1 = clock();
//链表的排序
int begin2 = clock();
lt.sort();
//sort(lt.begin(), lt.end());
int end2 = clock();
cout << "vector sort" << end1 - begin1 << endl;
cout << "list sort" << end2 - begin2 << endl;
}
}
int main()
{
std::test_list1();
return 0;
}
-
1
-
2
-
3
-
4
-
5
-
6
-
tetsOp