list以双链表的形式管理元素:
使用list时,需要加上头文件:
#include <list>
list与array,vector,deque的不同之处:
- list不提供随机访问,比如要访问第五个元素,你必须从第一个元素开始通过链指针到第五个元素。因此,访问任意元素时较慢。
- 在任意位置插入和删除元素很快,并且时间相同。
- list支持的异常处理:每一次操作成功或是一个no-op.
Special Modifying Operations for List
Operation | Effect |
c.unique() | 移除相同元素值的元素,使唯一 |
c.unique(op) | 当op()为true时移除相同元素,使唯一 |
c.splice(pos, c2) | 将c2的全部元素移动到c的pos位置前 |
c.splice(pos, c2, c2pos) | 将c2的c2pos位置的元素移动到c的pos位置前 |
c.splice(pos, c2, c2beg, c2end) | 将c2的[c2beg, c2end)元素移动到c的pos位置前 |
c.sort() | 以<排序所有元素 |
c.sort(op) | 以op()排序所有操作 |
c.merge(c2) | 假定两container中的元素都是已排序的,移动c2的元素到c中,并保持排序 |
c.merge(c2, op) | 假定两container中的元素都是根据op()排序的,移动c2的元素到c中,并保持op()排序 |
c.reverse() | 颠倒所有元素的顺序 |
Example of Using Lists
#include<list>
#include<iostream>
#include<algorithm>
#include<iterator>
using namespace std;
void printLists(const list<int>& l1, const list<int>& l2)
{
cout << "list1: ";
copy(l1.cbegin(), l1.cend(), ostream_iterator<int>(cout, " "));
cout << endl << "list2: ";
copy(l2.cbegin(), l2.cend(), ostream_iterator<int>(cout, " "));
cout << endl << endl;
}
int main()
{
//create two empty lists
list<int> list1, list2;
//fill both list with elements
for(int i=0; i < 6; ++i) {
list1.push_back(i);
list2.push_front(i);
}
printLists(list1, list2);
//insert all elements of list1 before the first element with value 3 of list2
//- find() returns an iterator to the first element with value 3
list2.splice(find(list2.begin(), list2.end(), 3), list1);
printLists(list1, list2);
//move first element of list2 to the end
list2.splice(list2.end(), list2, list2.begin());
printLists(list1, list2);
//sort second list, assign to list1 and remove duplicates
list2.sort();
list1 = list2;
list2.unique();
printLists(list1, list2);
//merge both sorted lists into the first list
list1.merge(list2);
printLists(list1, list2);
}
输出: