STL中list常用操作
1、什么是list容器
- list是一个双向链表容器,可以在任意位置快速插入或删除元素,但是随机访问元素的速度较慢。
- list不可以随机访问,只能通过迭代器访问。所以不支持.at()和[]操作符。
it++ //right;
it + 5; //error
2、头部和尾部操作
//获取链表第一个结点
int x = l1.front();
x = l1.front();
//获取链表最后一个结点
x = l1.back();
//将第一个结点的值改为10
l1.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个3
list<int> l2;
l2.assign(l1.begin(), l1.end()); //将l1中的元素赋值给l2
list<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 10
l1.resize(5);
for(it = l1.begin(); it != l1.end(); it++)
cout << *it << " "; //10 10 10 0 0
return 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); //删除所有的30
for(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 << " ";
}
}