目录
一、接口使用
① 构造函数
②迭代器
③ 容量与元素修改
④ remove
⑤remove_if
⑥ unique
⑦sort()
⑧ merge()
二、对于迭代器失效问题
一、接口使用
① 构造函数
void MyListTest1()
{
list<int> l1;
list<int> l5(10, 5);
vector<int> v = { 4,5,7,8,2 };
list<int> l3(v.begin(), v.end());
list<int> l4(l3);
// c++11中
list<int> l2 = { 0,1,2,3,4,5 };
}
②迭代器
【注意】
1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动
void MyListTest2()
{
vector<int> v = { 4,5,7,8,2 };
list<int> l(v.begin(), v.end());
auto it = l.begin();
while (it != l.end())
{
cout << *it << " ";
it++;
}
cout << endl;
auto rit = l.rbegin();
while (rit != l.rend())
{
cout << *rit << " ";
rit++;
}
cout << endl;
}
③ 容量与元素修改
void PrintList(const list<int>& l)
{
auto it = l.begin();
while (it != l.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
void MyListTest3()
{
vector<int> v = { 4,5,7,8,2 };
list<int> l(v.begin(), v.end());
cout << l.back() << " " << l.front() << " " << endl;
cout << l.size() << endl;
}
void MyListTest4()
{
vector<int> v = { 4,5,7,8,2 };
list<int> l(v.begin(), v.end());
l.push_back(9);
l.push_front(20);
l.push_front(20);
l.push_front(20);
l.push_front(20);
cout << l.size() << endl;
l.pop_back();
l.pop_front();
cout << l.back() << " " << l.front() << " " << endl;
cout << l.size() << endl;
}
void MyListTest5()
{
vector<int> v = { 4,5,7,8,2 };
list<int> l(v.begin(), v.end());
auto it = l.begin();
l.insert(it, 10, 2);
l.insert(l.end(), 10);
}
void MyListTest6()
{
list<int> l = { 0,1,2,3,4,5,6,7,8 };
auto pos = find(l.begin(), l.end(), 5);
l.insert(pos, 5, 1);
PrintList(l);
}
void MyListTest7()
{
list<int> l = { 0,1,2,3,4,5,6,7,8 };
auto pos = find(l.begin(), l.end(), 5);
// pos = l.erase(pos);
l.erase(pos++);
cout << *pos << endl;
l.erase(l.begin(), l.end());
if (l.empty())
cout << "is empty" << endl;
else
cout << "is not empty" << endl;
}
④ remove
要删除的元素的值。
成员类型value_type是容器中元素的类型,在列表中定义为其第一个模板参数(T)的别名。
删除具有特定值的元素
从容器中删除与值相等的所有元素。这将调用这些对象的析构函数,并按删除的元素数减少容器大小。
与成员函数list::erase(使用迭代器)按位置删除元素不同,此函数(list::remove)按值删除元素。
存在一个类似的函数list::remove_if,它允许使用除相等比较以外的条件来确定是否删除元素。
⑤remove_if
从容器中删除Predicate pred返回true的所有元素。这将调用这些对象的析构函数,并根据移除的元素数量减少容器大小。
该函数为每个元素调用pred(*i)(其中i是该元素的迭代器)。列表中返回true的任何元素都将从容器中删除。
⑥ unique
没有参数(1)的版本将从容器中的每个连续相等元素组中删除除第一个元素之外的所有元素。
请注意,只有当元素与前面的元素相比较时,元素才会从列表容器中删除。因此,此函数对于排序列表特别有用。
第二个版本(2)将确定元素“唯一性”的特定比较函数作为参数。事实上,任何行为都可以实现(不仅是相等比较),但请注意,函数将为所有元素对调用binary_pred(*i,*(i-1))(其中i是元素的迭代器,从第二个元素开始),如果谓词返回true,则从列表中删除i。
移除的元素将被销毁。
对于有序列表就是去重保留第一个,对于下方无序元素,保留第一个,连续相等元素组中删除除第一个元素之外的所有元素。
⑦sort()
对列表中的元素进行排序,更改它们在容器中的位置。
通过应用使用运算符<(版本(1)中)或comp(版本(2)中)比较元素的算法来执行排序。这种比较应产生元素的严格弱排序(即,一致的传递性比较,而不考虑其自反性)。
生成的等价元素的顺序是稳定的:即,等价元素保持调用之前的相对顺序。
整个操作不涉及任何元素对象的构造、销毁或复制。元素在容器内移动。
(1) | void sort(); |
---|---|
(2) | template <class Compare> void sort (Compare comp); |
默认为由小到大排序
通过调用Compare改变排序的方向
⑧ merge()
通过将x的所有元素在其各自的订购位置转移到容器中(两个容器都已订购),将x合并到列表中。
这有效地删除了x中的所有元素(变为空),并将它们插入到容器中的有序位置(其大小根据传输的元素数量而扩展)。执行该操作时,不会构造或破坏任何元素:无论x是左值还是右值,或者value_type是否支持移动构造,都会传递这些元素。
具有两个参数(2)的模板版本具有相同的行为,但采用特定谓词(comp)来执行元素之间的比较操作。这种比较应产生元素的严格弱排序(即,一致的传递性比较,而不考虑其自反性)。
此函数要求列表容器的元素在调用之前已经按值(或comp)排序。有关无序列表的替代方案,请参见列表::splice。
假设这样的排序,根据运算符<或comp定义的严格弱排序,x的每个元素都插入到与其值对应的位置。生成的等价元素的顺序是稳定的(即,等价元素保持它们在调用之前的相对顺序,现有元素先于从x插入的等价元素)。
如果(&x==this),则函数不执行任何操作。
注意 merge接口的使用, 俩个对象在使用merge之前必须保证为有序序列
⑨ reverse()
反转链表
二、对于迭代器失效问题
迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。
因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代
器失效的。在pos位置插入元素之后,pos位置之后元素的迭代器
只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。
解决:用pos来接受