list构造函数
函数原型:
- list<T> lst; // list采用模板类实现,对象的默认构造形式。
- list(beg, end); // 构造函数采用区间拷贝,前闭后开[beg, end)区间中的元素。
- list(n, elem); // 构造函数将n个elem拷贝给本身。
- list(const list&lst); // 拷贝构造。
void test01()
{
// 默认构造
list<int>L1;
L1.push_back(10);
L1.push_back(20);
L1.push_back(30);
L1.push_back(40);
printList(L1);
// 区间拷贝
list<int>L2(L1.begin(),L1.end());
printList(L2);
// 拷贝构造
list<int>L3(L2);
printList(L3);
// 重复值
list<int>L4(10, 1000);
printList(L4);
}
打印函数要放前面:
void printList(const list<int>& L) {
for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
迭代器遍历方法与vector没什么区别;
list容器赋值与交换
函数原型:
assign(beg, end);
//将[beg, end)区间中的数据拷贝赋值给本身。assign(n, elem);
//将n个elem拷贝赋值给本身。list& operator=(const list &lst);
//重载等号操作符swap(lst);
//将lst与本身的元素互换。
list大小操作:
函数原型:
size();
//返回容器中元素的个数empty();
//判断容器是否为空resize(num);
//重新指定容器的长度为num,
- 若容器变长,则以默认值填充新位置。
- 如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem);
//重新指定容器的长度为num,
- 若容器变长,则以elem值填充新位置。
- 如果容器变短,则末尾超出容器长度的元素被删除。
list插入和删除
函数原型:
- push_back(elem);//在容器尾部加入一个元素
- pop_back();//删除容器中最后一个元素
- push_front(elem);//在容器开头插入一个元素
- pop_front();//从容器开头移除第一个元素
- insert(pos,elem);//在 位置插elem元素的拷贝,返回新数据的位置。
- insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
- insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
- clear();//移除容器的所有数据
- erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
- erase(pos);//删除pos位置的数据,返回下一个数据的位置。
- remove(elem);//删除容器中所有与elem值匹配的元素。
特别注意:remove是新增的;删除所有与输入条件一致的元素。
list数据存取
list不是连续线性空间来存取数据,因此不可以使用中括号 [idx] 和成员函数 at(idx) 来访问。
list的迭代器不支持随机访问,但是可以通过迭代器多次++和--来实现跳跃式访问。
只能是++或者--。
+1或者-1操作不允许,如果可以+1或者-2这样的操作,那么就可以通过随机数来实现随机访问跳跃了。
//数据存取
void test01()
{
list<int>L1;
L1.push_back(10);
L1.push_back(20);
L1.push_back(30);
L1.push_back(40);
//cout << L1.at(0) << endl;//错误 不支持at访问数据
//cout << L1[0] << endl; //错误 不支持[]方式访问数据
cout << "第一个元素为: " << L1.front() << endl;
cout << "最后一个元素为: " << L1.back() << endl;
//list容器的迭代器是双向迭代器,不支持随机访问
list<int>::iterator it = L1.begin();
//it = it + 1;//错误,不可以跳跃访问,即使是+1
}
通过front()访问首元素。通过back()访问最后一个元素。
测试迭代器是否支持随机访问,可以通过将迭代器 it + 1或者it - 1 这样的操作来验证。如果迭代器支持加一减一操作,那么就支持随机访问。
测试迭代器是否支持双向访问:可以通过迭代器 it++ 或者 it-- 这样的操作来验证。如果支持++则说明:迭代器支持前向访问,如果支持--,那么说明迭代器支持后向访问。
list反转和排序
函数原型:
reverse();
//反转链表sort();
//链表排序
reverse()是list或者vector的反转函数:成员函数。reserve()是vector种预留空间的成员函数。
//反转和排序
void test01()
{
list<int> L;
L.push_back(90);
L.push_back(30);
L.push_back(20);
L.push_back(70);
printList(L);
//反转容器的元素
L.reverse();
printList(L);
//排序
L.sort(); //默认的排序规则 从小到大
printList(L);
L.sort(myCompare); //指定规则,从大到小
printList(L);
}
排序sort函数默认是升序,它有两个重载:输入一个仿函数或者函数来实现降序。
返回值为bool类型,如果操作是int类型,那么输入两个参数也是int类型;并且如果时降序,那么第一个数就需要大于第二个数。如下所示。
bool myCompare(int val1 , int val2)
{
// 降序:就让前一个数 > 后一个数。
return val1 > val2;
}
所有不支持随机访问迭代器的容器,不可以用标准算法。
不支持随机访问迭代器的容器,内部会提供对应的一些成员函数的算法。