//双向链表 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’)); //查找元素,返回元素所在位置,重载了运算符,若不存在会返回无效的地址