STL学习笔记(四)——list

//双向链表 forward_list 为单向链表
1、定义(构造函数):
1)、list ls; //其未定义大小
2)、相关测试代码

		struct Node{
			int i;
			char c;
		};
		void fun(Node &a){
			cout << a.i<< '\t' << (int)a .c<< endl;
		}
		//定义
		void listDefine(){
			list <int> ls;
			list <Node> ls1(5);     //<>内为结构体,初值a.i为0,a.c为空字符;
			
			for_each(ls1.begin(),ls1.end(),fun);
		}

		int main(){
			listDefine();
			return 0;
		}
3)、list <Node> ls2(5,temp);  //其中Node temp = {8,'t'};
4)、list <Node> ls3(ls2);  //拷贝构造 
5)、list <Node> :: iterator ite = ls3.begin();  //list中不允许 ite+2  ,因为地址空间不连续
	list <Node> ls4(++ite,ls3.end()); //同4,用ls3的一段初始化

2、大小 //list没有容量的概念,其不提前申请空间
1)、cout << ls1.size() << endl; //为5
2)、ls1.resize(0); //此时s1.size()为0,且ls1.empty()为1;
3、输出
1)、for_each(ls1.begin(),ls1.end(),fun);
2)、for(ite;ite != ls2.end();ite++){
cout << ite -> i << ‘\t’ << ite -> c << endl;
}
3)、cout << ls2.front().i << ‘\t’ <<ls2.front().c << endl; //返回一个引用,指向list的第一个元素,使用.访问结构体成员
4)、cout << ls2.back().i << ‘\t’ <<ls2.back().c << endl; //返回一个引用,指向list的最后一个元素,使用.访问结构体成员
4、添加
相关代码

struct Node1{  //在C++中结构体本质是一种类,其成员默认为public
		int i;
		char c;
		Node1( int i,char c){ //构造函数
			this->i =i;
			this ->c =c;
		bool operator == (const Node1 &temp){  //运算符重载 ,ls.remove()用。
			if(this->i == temp.i && this->c == temp.c)
				return true;
			else
				return false;
		}
		bool operator < (const Node1 &temp){   //ls.sort() 用
			if(this->i < temp.i )
				return true;
			else
				return false;
		}
	};
	void fun1(Node1 &a){
		cout << a.i<< '\t' << a .c<< endl;
	}
	void listAdd(){
		Node1 temp = {8,'t'};   //初始化
		Node1 temp1(9,'s');		//利用构造函数初始化结构体
		list <Node1> ls;
		list <Node1> :: iterator ite = ls.begin();
		ls.push_front(temp);
		ls.push_front(temp1);
		ls.push_front(Node1(12,'a'));
		for_each(ls.begin(),ls.end(),fun1);
	}
1)、ls.push_front(temp);	//在链表头部插入数据,这样需要每次先创建一个Node类的temp,不方便
2)、ls.push_front(Node1(12,'a'));  //同1;代码可读性提高
3)、ls.push_back(Node1(1,'g'));	//在链表尾部插入数据
4)、ls.insert(++ite,Node1(2,'z'));  //在列表某个位置插入一个元素,使用前ite = ls.begin();先确定ite的位置
5)、ls.insert(++ite,2,Node1(9,'p'));//在列表某个位置插入多个元素,使用前ite = ls.begin();先确定ite的位置
6)、ls1.insert(ls1.begin(),ls.begin(),ls.end()); //在ls1的头部插入ls的一段

5、删除
1)、ls.pop_back(); //删除尾元素
2)、ls.pop_front(); //删除头部第一个元素
3)、ls.erase(++ite);//ls.erase(–ls.end());删除指定元素,使用前ite = ls.begin();先确定ite的位置,注意ls.end()返回“最后一个的下一个位置”
4)、ls.erase(++ite,ls.end()); //删除一段元素
5)、ls.clear(); //清空列表
6)、ls.remove(Node1(1,‘a’); //删除列表中所有参数相同的元素,这里需要重载 == 运算符 ,定义见4添加,原型为erase(),其将参数与列表逐一比较,
实则比较的是结构体,故需要重载 运算符
7)、ls.unique(); //删除列表中相邻且相同的元素,也需要重载 == 运算符,原型为erase()
6、修改
1)、ite -> c = ‘g’; //使用迭代器修改元素
2)、ls.assign(3,Node1(8,‘t’)); //此时列表的size为3,且所有元素为(8,‘t’)
3)、ls1 = ls; //拷贝ls ,list 重载了=运算符
4)、ls1.assign(ls.begin(),ls.end()); //同3,注意要想复制ls的一段,应使用迭代器ite进行++ ,不能ls.begin()+2操作
7、合并及其他操作
1)、ls1.swap(ls); //交换两个list
2)、ls.reverse(); //将列表倒置,头变尾,尾变头,注意与string 和vector中reserve()修改容量函数区分
3)、ls.sort(); //排序,需要重载<运算符,具体从小到大还是大到小排序取决于重载函数内部的实现,重载定义见4。
可配合reverse反转使用。注意其于string和vector中的排序不同,他用.操作进行排序
4)、ls.merge(ls1); //合并两个列表,也需要重载<运算符
8、算法
1)、for_each();
2)、sort();
3)、ite = find(ls.begin(),ls.end(),Node1(1,‘a’)); //查找元素,返回元素所在位置,重载了
运算符,若不存在会返回无效的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值