list的特点数据结构为双向链表,当你需要大量进行插入操作时候应选择它,
不提供随机访问接口,使用时应包含头文件list,打开std命名空间。
**list的迭代器:**双向迭代器(所以凡是用到随机存取迭代器的算法都不能调用)
list的存储方式和增长方式: 双向链表结构,新建结点插入。
list的常用定义:
list<T>c; //产生一个空的list,存储T类型对象
list<T>c1(c2); //产生一个与c2同型别的list,将每个元素都复制
list<T>c(n); //产生拥有n个元素的list,默认值由T构造函数决定
list<T>c(n,elem); //效果同上,elem为指定的默认值
list<T>c(iterator1,iterator2);//将[itreator1,iterator2)的元素为初始值
list<int>t = {1,2,3,4}; //列表式初始化
c.~list<T>(); //销毁所有元素,释放内存
容器容量函数 | 效果 |
---|---|
c.size() | 返回元素个数 |
c.empty() | 判断容器是否为空 |
c.max_size() | 元素的最大可能数量(一般不用) |
赋值交换函数 | 效果 |
---|---|
c1=c2 | 将c2的全部元素赋值给c1 |
c.assign(n,elem) | 将c的内容赋值为n个值为elem的元素 |
c.assign(iterator1,iterator2) | 将c的内容赋值为区间[iterator1,iterator2)指向的元素 |
c.swap(c2) | 将c和c2互换 |
swao(c1,c2) | 效果同上,但效率不如上版本(此版本为泛化) |
元素的存取:list不支持随机存取,只有back()和front()能直接存取元素
元素存取函数 | 效果 |
---|---|
c.front() | 返回第一个元素,不检查元素是否存在 |
c.back() | 返回最后一个元素,不检查元素是否存在 |
由于这些操作不检查容器是否为空,可能会发生未定义行为,调用者最好在操作前使用c.empty()检查容器是否为空。
迭代器相关函数 | 效果 |
---|---|
c.begin() | 返回一个双向迭代器,指向第一个元素 |
c.end() | 返回一个双向迭代器,指向最后一个元素的下一位置 |
c.rbegin() | 返回一个双向迭代器,指向逆向迭代的第一个元素 |
c.rend() | 返回一个双向迭代器,指向逆向迭代的最后一个元素的下一位置 |
list的安插、移除函数 | 效果 |
---|---|
c.insert(iterator,elem) | 在迭代器iterator指向的位置前添加元素elem,返回指向elem的迭代器 |
c.insert(iterator,n,elem) | 在迭代器iterator指向的位置前添加n个元素elem,返回指向iterator-n位置元素的迭代器 |
c.insert(iterator1,iterator2,iterator3) | 在iterator1前插入区间[iterator2,iterator3)内的元素,并返回指向iterator1-n位置上的迭代器,n为插入元素的个数 |
c.push_back(elem) | 在尾部添加一个elem的副本 |
c.pop_back() | 移除最后一个元素 |
c.push_front(elem) | 在头部添加一个elem的副本 |
c.pop_front() | 移除头部第一个元素 |
c.remove(val) | 移除容器中所有值为val的元素 |
c.remove_if(op) | 接受一个函数对象,移除所有满足函数的元素 |
c.erase(iterator) | 移除iterator指向的元素,返回指向下一元素的迭代器 |
c.erase(iterator1,iterator2) | 移除[iterator1,iterator2)区间的元素,返回iterator2迭代器 |
c.resize(num) | 将容器元素个数改为num个,若num<c.size(),则移除多出的元素,若num>c.size(),则增加元素,默认值由构造函数决定 |
c.resize(num,elem) | 效果同上,elem为指定默认值 |
c.clear() | 将容器全部元素移除,清空容器 |
关于c.remove_if的使用:
list<int>c = {1,2,3,4};
for (auto e : c)
cout << e;
cout << endl;
cout << "删除c中小于i的元素:";
int i;
cin >> i;
//提供两种使用方法,1:使用库函数,2:自定义lambada 表达式---临时函数
//c.remove_if(bind2nd(less<int>(),i));
//c.remove_if([i](int x)->bool { return i > x; });
for (auto e : c)
cout << e;
cout << endl;
list的特殊成员函数 | 效果 |
---|---|
c.sort() | 将容器内的元素按升序排序 |
c.sort(op) | 以op()为准则排序,[](int x,int y)->bool{return x>y; } 一种降序的写法 |
c.unique() | 移除相邻重复元素,建议调用前先用sort()函数排序 |
c.unique(op) | op是接受两个参数的函数,分别传入前后两个元素,满足条件移除元素 |
c.splice(iterator,c2) | 将c2的所有元素转移到iterator指向的位置,iterator应为c的迭代器,c2容器被清空 |
c1.splice(iterator,c2,c2iterator) | 将c2iterator指向的元素转移到c1中iterator指向的位置前面 |
c1.splice(iterator,c2iterator1,c2iterator2) | 同上,两个迭代器为转移元素的范围 |
c.merge(c2) | 假设c和c2容器元素已序,将c2的全部元素转到c中,并保证合并后仍有序 |
c.reverse() | 将所有元素反序 |
关于c.unique(op)的使用例子
int main()
{
list<int>c1 = {0,1,3,2,3,4,5};
c1.unique([](int i, int j)->bool { return (j - i) == 2; });
copy(c1.begin(),c1.end(),ostream_iterator<int>(cout," "));//输出结果012345
list<int>c2 = {0,2,3,3,5,5,4};
c2.unique([](int i, int j)->bool { return (j - i) == 2; });
copy(c2.begin(),c2.end(),ostream_iterator<int>(cout," "));//输出结果0334
//可以看到,我们会将满足函数条件的第二参数移除,每个j都与i比较
//注意!注意!!判断式是并非拿元素与前一紧邻元素比较
//而是与其未被移除的前一元素比较。
}
关于异常,list的异常安全性得到了最佳支持,所有操作(除了排序和赋值)要么成功,要么无效。