链表是由一系列的结点组成,结点包含两个域,一个数据域,一个指针域。
链表内存是非连续的,添加和删除元素,时间复杂度都是常数项。
- 在链表中插入元素,不需要移动元素。比数组添加删除效率高。
- 链表只有在需要的时候才分配内存。
一构造函数
list<int> lt;
list(beg, end);
list(n, elem);
list(const list & lt);
二.插入、删除
list<int> lt;
lt.push_back(elem);//在容器尾部加入一个元素
lt.pop_back();//删除容器最后一个元素
lt.push_front(elem);//在容器开头插入一个元素
lt.pop_front();//删除容器开头第一个元素
lt.insert(pos, elem);//在pos位置插入元素elem,返回新数据位置
lt.insert(pos, n, elem);//在pos位置插入n个elem,无返回值
lt.insert(pos, beg, end);//在pos位置插入[beg,end)区间的数据,无返回值
lt.clear();//清除全部元素
lt.erase(beg, end);//清除区间[beg,end)的数据,返回下一个数据位置
lt.erase(pos);//删除pos位置数据,返回下一个数据位置
lt.remove(elem);//删除容器中与elem值匹配元素
插入测试:
lt.push_back(2);
lt.push_front(1);
lt.insert(lt.begin(), 0);
lt.insert(lt.end(), 3);
list<int>::iterator it = lt.begin();
it++;
it++;
lt.insert(it, 4);//第二个位置插入
for (int v : lt) {
cout << v << " ";
}
结果:
三.大小操作
list<int> lt;
lt.size();//返回容器中元素个数
lt.empty();//判断容器是否为空
lt.resize(num);//重新指定容器长度为num,若容器变长,则以默认值填充新位置
四.数据存取
list<int> lt;
lt.front();//返回第一个元素
lt.back();//返回最后一个元素
五.赋值操作
list<int> lt,lt1;
int a[] = { 0,1,2,3 };
lt.assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身
lt.assign(n, elem);//将n个elem拷贝给本身
list& operator=(const list & lt);//等号操作符重载
lt1.swap(lt);//将lt与本身元素互换
六.反转、排序
bool mycompare(int a,int b) {//排序规则
return a > b;
}
//
list<int> lt;
lt.reverse();//反转链表,1,3,5反转5,3,1
lt.sort();//排序由小到大
lt.sort(mycompare);//排序:由大到小
测试:
bool mycompare(int a,int b) {//排序规则
return a > b;
}
void test06() {
list<int> lt;
lt.push_back(1);
lt.push_back(3);
lt.push_back(2);
for (int v : lt) {
cout << v << " ";
}
cout << endl;
lt.reverse();//反转链表,1,3,5反转5,3,1
for (int v : lt) {
cout << v << " ";
}
cout << endl;
lt.sort();//排序:有小到大
for (int v : lt) {
cout << v << " ";
}
cout << endl;
lt.sort(mycompare);//排序:由大到小
for (int v : lt) {
cout << v << " ";
}
cout << endl;
}