1、list是一个双向链表,对于任何位置的元素的插入和元素移除,list永远是常数时间
2、list有一个重要性质:插入操作和接合操作都不会造成原有list迭代器的失效,甚至list的元素的删除操作(erase),也只有“指向被删除元素”的那个指针失效,其他迭代器不受影响
int arr[] = {87,65,73,47,75,73,78,65};
list<int>ls_scores(arr,arr+8);
int flag=0;
for(list<int>::iterator iter = ls_scores.begin(); iter != ls_scores.end();)
{
if(*iter == 47 )
{
//如果调用ls_scores.erase(iter); 访问iter的时候程序会崩溃
//改为iter++,iter指向被删除元素的下一个元素,cout << *iter能够正常打印
ls_scores.erase(iter++);
}
else
iter++;
cout << *iter<< endl;
cout << &(*iter) << endl;
}
对比vector
int arr[] = {87,65,73,47,75,73,78,65};
vector<int>vec_scores(arr,arr+8);
int flag=0;
for(vector<int>::iterator iter = vec_scores.begin(); iter != vec_scores.end();)
{
if(*iter == 47 )
{
//如果调用ls_scores.erase(iter); 访问iter的时候,程序会崩溃
//改为iter++,iter指向被删除元素的下一个元素,由于指向下一个元素的迭代器也失效了,程序崩溃
vec_scores.erase(iter);
//正确做法
//iter = vec_scores.erase(iter);
}
else
iter++;
cout << *iter<< endl;
cout << &(*iter) << endl;
}
3、算法中提供的sort()函数,不适用于list,list自己实现了sort
int arr[] = {87,65,73,47,75,73,78,65};
//算法sort
vector<int>vec_scores(arr,arr+8);
sort(vec_scores.begin(),vec_scores.begin()+3);
//list自己实现sort,list不能对指定范围内的元素排序
list<int>ls_scores(arr,arr+8);
ls_scores.sort();
4、list是环状链表,实现方式:刻意在环状链表的尾端加上一个空白节点,这样符合迭代器的“前闭后开”区间