/*
 *
 ********************************************
 *   list双向链表容器的基础说明:
 ********************************************
 *
 * list双向链表容器采用双向链表的数据结构来存储元素数据,可以高效查找、插入、删除容器元素
 *
 * Reversibe Container  Back Insertion Sequence  Front Insertion Sequence
 * 不同于vector,list查找、插入、删除元素的时间复杂度均为O(1)
 * 
 * 使用list必须使用宏语句#include <list>
 *
 **************************************************************************************
 *
 * 创建list对象:
 * 1.list<int> a;
 * 2.list<int> a(10);      //具有10个元素的对象a,每个元素默认值为0
 * 3.list<char> a(5,'k');
 * 4.list<char> b(a);      //list<char> c(a.begin(),a.end())
 *
 **************************************************************************************
 *
 * 初始化赋值
 * void push_back(const T& value)
 *
 **************************************************************************************
 *
 * 遍历访问
 * iterator begin()   //只能使用迭代器的方式进行遍历
 * iterator end()
 *  iterator rbegin();   //反向遍历
 *  iterator rbegin();
 * 
 **************************************************************************************
 *
 * 常用函数
 *
 * bool empty();
 * 
 * void pop_front(); void pop_back();
 * 
 * void push_front(const T&); void push_back(const T&);
 * iterator insert(iterator pos,const T&x); //注意它是插入到pos前
 *
 * iterator erase(iterator pos);
 * iterator erase(iterator first,iterator last);
 * void clear();
 * void remove(const T& value);
 *
 * void swap()         //通过交换头指针来实现元素的交换
 * //list内部提供的一个迁移操作
 * void transfer();       //transfer(iterator position,iterator first,iterator last)在A链表position位置前插入
 *            //B链表迭代器区间[first,last)的元素,并将这部分元素从B链表中抹去
 * void splice(iterator pos,list& X);   //调用transfer函数将一个链表的所有元素全部归并到当前链表,
 *            //并将链表对象X清空,
 * void splice(iterator pos,list& X,iterator i); //将X中迭代器i所指的元素归并到当前链表pos前,并将X中i所指元素抹去
 * 
 * void merge(list&X); //对两个链表进行归并,要求先排序,否则merge没有太大意义
 *
 * void unique();  //可将连续重复的元素删除,只保留一个
 *
 *
 *
 ********************************************
 * Author: cumirror   
 * Email: tongjinooo@163.com
 ********************************************
 *
 */

#include <list>
#include <iostream>   
#include <string>   
using namespace std;

struct student{
 char* name;
 int age;
 char* city;
 char* phone;
};

class studentNew{
public:
 char name[10];
 int age;
 char city[10];
 char phone[11];
 studentNew(){}
 studentNew(char* a,int b,char* c,char* d){
  strcpy(name,a);
  age=b;
  strcpy(city,c);
  strcpy(phone,d);
 }

//为何友元函数在类外定义,出现错误error C2593: 'operator >' is ambiguous
//friend bool operator < (studentNew&a,studentNew& b);
//friend bool operator > (studentNew&a,studentNew& b);
//friend bool operator == (studentNew&a,studentNew& b);

friend bool operator< (studentNew& a,studentNew& b){
 return strcmp(a.name,b.name)<0;
}
friend bool operator> (studentNew& a,studentNew& b){
 return strcmp(a.name,b.name)>0;
}
friend bool operator== (studentNew& a,studentNew& b){
 return strcmp(a.name,b.name)==0;
}

bool operator() (studentNew& a,studentNew& b){
 return strcmp(a.name,b.name)==-1;
}
};
/*
bool operator < (studentNew& a,studentNew& b){
 return strcmp(a.name,b.name)<0?true:false;
}
bool operator > (studentNew& a,studentNew& b){
 return strcmp(a.name,b.name)>0?true:false;
}
bool operator == (studentNew& a,studentNew& b){
 return strcmp(a.name,b.name)==0?true:false;
}
*/

int main(){
/* list<int> a;
 a.push_back(4);
 a.push_back(3);
 a.push_back(2);
 a.push_back(8);
 a.push_back(7);
 a.push_back(5);
 a.push_back(6);
 a.push_back(9);
 a.push_back(10);
 a.push_back(1);

// list的sort函数实现方法,如下

 list<int> carry;
 list<int> counter[64];
 int fill=0;
 while(!a.empty()){
 carry.splice(carry.begin(),a,a.begin());
 int i=0;
 while(i<fill&&!counter[i].empty()){
  counter[i].merge(carry);
  carry.swap(counter[i++]);
 }
 carry.swap(counter[i]);
 if(i==fill)++fill;
 }
 for(int i=1;i<fill;++i){
  counter[i].merge(counter[i-1]);
  a.swap(counter[fill-1]);
 }
 for(list<int>::iterator j=a.begin();j!=a.end();j++){
  cout<<*j<<endl;
 }
*/
// 其它函数使用示例,如下:

 student s[]={
  {"童进",23,"武汉","XXX"},
  {"老大",23,"武汉","XXX"},
  {"饺子",23,"武汉","XXX"}
 };
 list<student> classA;
 classA.push_back(s[0]);
 classA.insert(classA.begin(),s[1]);
 classA.push_back(s[3]);
 cout<<classA.begin()->name<<endl;
// classA.sort();                //对于自定义结构体,没有重载</>/==这些操作符,故无法排序

// 自己创建一个新类studentNew重载操作符再进行判断
 studentNew m1("童进",23,"武汉","XXX");
 studentNew m2("老大",23,"武汉","XXX");
 studentNew m3("饺子",23,"武汉","XXX");
 list<studentNew> classNew;
 classNew.push_back(m1);
 classNew.push_back(m2);
 classNew.push_back(m3);
// 判断友元函数是否起作用
 if( m1>m2 ){
  cout<<"新类中操作已经重载成功"<<endl;
 }
// 运用SGI STL库时
// 用函数对象studentNew,替换了greater<T>
 classNew.sort(studentNew());
// 若用VC自带的STL库时,下面这样书写即可实现.至于为何有这样的差异,目前我还不知
// classNew.sort(); 
 for(list<studentNew>::iterator m=classNew.begin();m!=classNew.end();m++){ //通过结果可以看出
  cout<<m->name<<endl;             //classNew已经进行了重新排列
 }                              

 list<string> classB;
 classB.push_back("童");
 classB.push_back("兰");
 classB.push_front("张");
 classB.push_back("童");
 classB.sort();                //对于string类型,有默认类型的greater<T>
 classB.unique();               //剔除重复数据
 for(list<string>::iterator k=classB.begin();k!=classB.end();k++){
  cout<<*k<<endl;
 }
 return 0;
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐