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;
}

所有不支持随机访问迭代器的容器,不可以用标准算法。

不支持随机访问迭代器的容器,内部会提供对应的一些成员函数的算法。