1、什么是list容器
- list是一个双向链表容器,可以在任意位置快速插入或删除元素,但是随机访问元素的速度较慢。
- list不可以随机访问,只能通过迭代器访问。所以不支持.at()和[]操作符。
it++ //right;
it + 5; //error
2、头部和尾部操作
//获取链表第一个结点int x = l1.front();x = l1.front();//获取链表最后一个结点x = l1.back();//将第一个结点的值改为10l1.front() = 10;
3、list与迭代器
list的迭代器是双向迭代器,不支持随机访问,只能通过++或--来移动迭代器。
正向迭代器:
//正向迭代器例子:list<int> l1 = {1, 2, 3, 4, 5};list<int>::iterator it = l1.begin();while (it != l1.end()) {cout << *it << " ";it++;}
反向迭代器:
//反向迭代器例子:list<int> l1 = {1, 2, 3, 4, 5};list<int>::reverse_iterator rit = l1.rbegin();while (rit != l1.rend()) {cout << *rit << " ";rit++;}
4、list带参数构造
list(n,elem) //构造函数,创建n个值为elem的元素
list(begin, end); //构造函数,使用区间[begin, end)的元素构造list
list(const list &lst); //拷贝构造函数
注意:list(begin, end) 不支持迭代器 + n的操作
list<int> l2(l1.begin()+ 1, l2.end()); //error
//list(begin, end)
int main()
{list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);list<int>::iterator beg = l1.begin();list<int>::iterator end = l1.begin();beg++; end++;end++;end++;list<int> l2(beg, end); //此处为左闭右开区间list<int>::iterator it2;for(it2 = l2.begin(); it2 != l2.end(); it2++){cout << *it2 << " ";}cout << endl;return 0;
}
list<int> l1(5, 10); //创建5个值为10的元素
list<int> l2(l1.begin(), l1.end()); //使用l1的元素构造l2
list<int> l3(l2); //使用l2构造l3
5、list赋值
list.assign(beg, end); //将[begin, end)区间中的元素赋值给list
list.assign(n, elem); //将n个elem的元素赋值给list
list &operator=(const list &lst); //重载等号操作符
list.swap(lst); //将lst与当前的list交换
list<int> l1;list<int>::iterator it;l1.assign(3, 10); //将l1中的元素初始化为10个3list<int> l2;l2.assign(l1.begin(), l1.end()); //将l1中的元素赋值给l2list<int>::iterator it2 = l1.end();it2--;for(it = l1.begin(); it != it2; it++){cout << *it << " ";}l1.assign(4,1); //assign函数不是追加,而是重新赋值l1.swap(l2); //交换l1和l2的元素
6、list大小操作
list.size(); //返回list中元素的个数
list.empty(); //判断list是否为空
list.resize(num); //重新指定list的大小,如果num大于当前list的大小,则插入默认值;如果num小于当前list的大小,则删除后面的元素
list.resize(num, elem); //重新指定list的大小,并填充默认值
,如果num大于当前list的大小,则插入elem;如果num小于当前list的大小,则删除后面的元素
int main()
{list<int> l1;list<int>::iterator it;l1.assign(3, 10);int len = l1.size();for(it = l1.begin(); it != l1.end(); it++)cout << *it << " "; //10 10 10l1.resize(5); for(it = l1.begin(); it != l1.end(); it++)cout << *it << " "; //10 10 10 0 0return 0;
}
7、list的插入
插入不会使list的迭代器失效。
list.insert(pos, elem); //在pos位置插入elem元素,返回新元素的迭代器
list.insert(pos, n, elem); //在pos位置插入n个elem元素
list.insert(pos, beg, end); //在pos位置插入[beg, end)区间的元素
8、list的删除
删除可能会使list的迭代器失效。
list.pop_front(); //删除第一个元素
list.pop_back(); //删除最后一个元素
list.erase(pos); //删除pos位置的元素,返回下一个元素的迭代器
list.erase(beg, end); //删除[beg, end)区间的元素,返回下一个元素的迭代器
list.remove(elem); //删除所有与elem值匹配的元素
list.clear(); //删除所有元素
int main()
{list<int> l1;list<int>::iterator it = l1.begin();l1.push_back(1);l1.push_back(25);l1.push_back(39);l1.push_back(47);list<int>::iterator it1 = l1.begin();for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " ";}cout << endl;it = l1.erase(it1); //删除单一元素,返回的是被删除元素的下一个元素的迭代器cout << *it << endl; // 25
}
//删除某一区间的元素list<int>::iterator it1 = l1.begin();list<int>::iterator it2 = l1.begin();it2++;it2++;l1.erase(it1, it2); //删除第一个和第二个元素for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " ";}
//删除所有的30
int main()
{list<int> l1;list<int>::iterator it = l1.begin();l1.push_back(30);l1.push_back(25);l1.push_back(30);l1.push_back(30);l1.push_back(47);l1.push_back(30);for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " ";}cout << endl;l1.remove(30); //删除所有的30for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " ";}return 0;
}
9、list的排序
list.sort(); //对list中的元素进行排序
list.reverse(); //反转链表
list.unique(); //删除相邻重复的元素,只保留一个。
//unique()
int main()
{list<int> l1;list<int>::iterator it = l1.begin();l1.push_back(30);l1.push_back(30);l1.push_back(25);l1.push_back(30);l1.push_back(30);l1.push_back(30);l1.push_back(47);l1.push_back(30);for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " "; // 30 30 25 30 30 30 47 30}cout << endl;l1.unique();for(it = l1.begin(); it != l1.end(); it++){cout<< *it << " "; //30 25 30 47 30}
}
10、list迭代器失效
在删除元素时,迭代器会失效,不能继续使用,否则会报错。
int main()
{list<int> l1;list<int>::iterator it = l1.begin();l1.push_back(30);l1.push_back(30);l1.push_back(25);l1.push_back(30);l1.push_back(30);l1.push_back(30);l1.push_back(47);l1.push_back(30);l1.push_back(30);//迭代器失效的情况for (it = l1.begin(); it != l1.end();){if(*it == 30){l1.erase(it); //正确做法:it = l1.erase(it); 删除元素后,使it指向下一个元素}else{it++;}}for(it = l1.begin(); it != l1.end(); it++){cout << *it << " ";}
}