c++STL 의 list 구조 체 의 증가,삭제,정렬 등에 대한 자세 한 설명

19928 단어 c + +STLlist구조 체
STL 의 list 에 대해 더 배우 고 프로 그래 밍 과정 에서 구조 체 에 대한 조작 이 많 습 니 다.
모든 코드 는 다음 과 같 습 니 다:

/*
 Project:list       
 Date: 2018/07/14
 Author: Frank Yu
	    :int size()         ;bool empty()         ,true  ;
	    :void push_back(  )           ;push_front(  )           ;
	  iterator insert(lit,  )      lit     ,            ;
			 void insert(lit,n,  )      lit   n     ;
			 void insert(lit,first,last)  [first,last)      lit ;
	    :void pop_back()       ,         ;    ,    decrementable
	  void pop_front()       ,         ;   ,    decrementable
			 void remove(  )           ;void clear()      
			 iterator erase(lit)  lit     ,       
	    :iterator begin()           ;iterator end()           
	  reverse_iterator rbegin()              ;reverse_iterator rend()               
	  reference front()     ;reference back()     
	    :void sort()    ;void sort(Pred pr)        ;
	    :void swap(list & str)   list    ;void unique()       ,    ;
	  void splice(iterator lit,list &x) list x       lit ,x   
			 void splice(iterator lit,list &x,iterator first) list x [first,end)       ,  lit ,x   
			 void splice(iterator lit,list &x,iterator first,iterator last) list x [first,last)       ,  lit ,x   
			 void reverse()        
			 void unique()            ,    ,    
			 void Merge(list<  >)    ,    list  ,         , set,       
       push_back()、push_front()、insert()、pop_back()、pop_front()、remove()、erase()、clear()
	  begin()、end()、rbegin()、rend()、front()、end()、sort()   
				     list         、  、  、    
*/
#include<iostream>
#include<list>
#include<string>
#include<iterator>
#include<algorithm>
using namespace std;
//   、   、  ***********************************************************************************
typedef struct node//     
{
	int sno;//    
	string sname;//    
	double sgrade;//    
}Student;
 list<Student> s;
 list<Student>::iterator lit;
 list<Student>::reverse_iterator rlit;
 bool operator ==(const Student &stu1,const Student &stu2)//   == ,    const  
 {
	 bool flag=false;
	 if(stu1.sno==stu2.sno&&stu1.sname==stu2.sname&&stu1.sgrade==stu2.sgrade)flag=true;
	 return flag;
 }
//  ***********************************************************************************
void menu()//   
{
	cout<<"*************1.      2.    *************"<<endl;
	cout<<"*************3.    4.     ***********"<<endl;
	cout<<"*************5.       6.    *************"<<endl;
	cout<<"*************7.  "<<endl;
}
void menu_Add()//      
{
	cout<<"*************1.          2.        *************"<<endl;
	cout<<"*************3.          4.        *************"<<endl;
	cout<<"*************5.           6.            *****"<<endl;
	cout<<"*************7.     "<<endl;
}
void menu_Delete()//      
{
	cout<<"*************1.          2.       *************"<<endl;
	cout<<"*************3.        4.         **********"<<endl;
	cout<<"*************5.        6.     "<<endl;
}
void menu_Sort()//      
{ 
	cout<<"*************1.         2.       *************"<<endl;
	cout<<"*************3.         4.       *************"<<endl;
	cout<<"*************5.     "<<endl;
}
//  ***********************************************************************************
void Display()//  
{
	int choice;
	cout<<"*********0.     1.    *************"<<endl;
	cin>>choice;
	if(choice==0)
	{
		if(s.empty())cout<<"      !!!"<<endl;
		for(lit=s.begin();lit!=s.end();lit++)
		{
		 cout<<"-------------------------------------------"<<endl;
		 cout<<"  :"<<(*lit).sno<<endl;
		 cout<<"  :"<<(*lit).sname<<endl;
		 cout<<"  :"<<(*lit).sgrade<<endl;
		 cout<<"-------------------------------------------"<<endl;
		}
	}
	else
	{
	 if(s.empty())cout<<"      !!!"<<endl;
	 for(rlit=s.rbegin();rlit!=s.rend();rlit++)
		{
		 cout<<"-------------------------------------------"<<endl;
		 cout<<"  :"<<(*rlit).sno<<endl;
		 cout<<"  :"<<(*rlit).sname<<endl;
		 cout<<"  :"<<(*rlit).sgrade<<endl;
		 cout<<"-------------------------------------------"<<endl;
		}
	}
}
void Add()//  
{
 int choice,n,place;Student stu;
 while(1)
 {
 menu_Add();
 cout<<"     :"<<endl;
 cin>>choice;
 if(7==choice)break;
 switch(choice)
 {
 case 1:{
		 cout<<"        、  、  :"<<endl;
			cin>>stu.sno>>stu.sname>>stu.sgrade;
			s.push_back(stu);Display();
		 }break;
	case 2:{
		 	cout<<"        、  、  :"<<endl;
			cin>>stu.sno>>stu.sname>>stu.sgrade;
			s.push_front(stu);Display();
		 }break;
	case 3:{
		 cout<<"           :"<<endl;
			cin>>n;
			for(int i=0;i<n;i++)
			{
			 cout<<"    "<<i+1<<"      、  、  :"<<endl;
			 cin>>stu.sno>>stu.sname>>stu.sgrade;
			 s.push_back(stu);
			}
			Display();
		 }break;
	case 4:{
		 	cout<<"           :"<<endl;
			cin>>n;
			for(int i=0;i<n;i++)
			{
			 cout<<"    "<<i+1<<"      、  、  :"<<endl;
			 cin>>stu.sno>>stu.sname>>stu.sgrade;
			 s.push_front(stu);
			}
			Display();
		 }break;
	case 5:{
		 cout<<"            (      0):"<<endl;
			while(1)
			{
			cin>>place;
			if(place<0||place>s.size()){cout<<"      !!!"<<endl;continue;}
			break;
			}
			lit=s.begin();
			while(place)
			{
				lit++;
				place--;
			}
			cout<<"        、  、  :"<<endl;
			cin>>stu.sno>>stu.sname>>stu.sgrade;
			lit=s.insert(lit,stu);
			Display();
		 }break;
	case 6:{
		 cout<<"            (      0):"<<endl;
			while(1)
			{
			cin>>place;
			if(place<0||place>s.size()){cout<<"      !!!"<<endl;continue;}
			break;
			}
			lit=s.begin();
			while(place)
			{
				lit++;
				place--;
			}
			cout<<"        、  、  :"<<endl;
			cin>>stu.sno>>stu.sname>>stu.sgrade;
			cout<<"         :"<<endl;
			cin>>n;
			s.insert(lit,n,stu);
		 Display();
		 }break;
	default:cout<<"    !!!"<<endl;
 }
 }
}
void Delete()//  
{
 int choice;Student stu;
 while(1)
 {
 menu_Delete();
 cout<<"     :"<<endl;
 cin>>choice;
 if(6==choice)break;
 switch(choice)
 {
 case 1:{
		 if(s.empty())cout<<"      ,    "<<endl;
			 else{
				 s.pop_back();
				 Display();
			 }
		 }break;
	case 2:{
		 if(s.empty())cout<<"      ,    "<<endl;
			 else{
				 s.pop_front();
				 Display();
			 }
		 }break;
	case 3:{
		 cout<<"        、  、  :"<<endl;
			cin>>stu.sno>>stu.sname>>stu.sgrade;
			s.remove(stu);
			Display();
		 }break;
	case 4:{
		 int sno;
		 cout<<"     :"<<endl;
			cin>>sno;
			for(lit=s.begin();lit!=s.end();)//    ,  ==      
			{
				if((*lit).sno==sno)lit=s.erase(lit);//         
				else lit++;
			}
			Display();
		 }break;
	case 5:{
  s.clear();
			cout<<"   !!!"<<endl;
		 }break;
	default:cout<<"    !!!"<<endl;
 }
 }
}
bool cmp_sno_up(const Student &stu1,const Student &stu2)//         
{
	bool flag;
	stu1.sno<stu2.sno?flag=true:flag=false;
	return flag;
}
bool cmp_sno_down(const Student &stu1,const Student &stu2)//         
{
	bool flag;
	stu1.sno>stu2.sno?flag=true:flag=false;
	return flag;
}
bool cmp_sgrade_up(const Student &stu1,const Student &stu2)//         
{
	bool flag;
	stu1.sgrade<stu2.sgrade?flag=true:flag=false;
	return flag;
}
void Sort()//  
{
 int choice;Student stu;
 while(1)
 {
 menu_Sort();
 cout<<"     :"<<endl;
 cin>>choice;
 if(5==choice)break;
 switch(choice)
 {
 case 1:{
		 s.sort(cmp_sno_up);//     
		 Display(); 
		 }break;
	case 2:{
		 s.sort(cmp_sno_down);//     
		 Display(); 
		 }break;
	case 3:{
		 s.sort(cmp_sgrade_up);//     
			Display();
		 }break;
	case 4:{
		 s.sort(cmp_sgrade_up);//     
			s.reverse();  //  ,          ,        ,
			Display();  //                  
		 }break;
	case 5:{
  s.clear();
			cout<<"   !!!"<<endl;
		 }break;
	default:cout<<"    !!!"<<endl;
 }
 }
}
void Showfront()//     
{
	Student stu;
	if(s.empty())cout<<"      !!!"<<endl;
	else
	{
		stu=s.front();
		cout<<"-------------------------------------------"<<endl;
		cout<<"  :"<<stu.sno<<endl;
		cout<<"  :"<<stu.sname<<endl;
		cout<<"  :"<<stu.sgrade<<endl;
		cout<<"-------------------------------------------"<<endl;
	}
}
void Showend()//     ,   end  ,end           ,       
{
	Student stu;
	if(s.empty())cout<<"      !!!"<<endl;
	else
	{
		rlit=s.rbegin();
		cout<<"-------------------------------------------"<<endl;
		cout<<"  :"<<(*rlit).sno<<endl;
		cout<<"  :"<<(*rlit).sname<<endl;
		cout<<"  :"<<(*rlit).sgrade<<endl;
		cout<<"-------------------------------------------"<<endl;
	}
}
//   *********************************************************************************
int main()
{
 int choice;
 while(1)
 {
 menu();
 cout<<"     :"<<endl;
 cin>>choice;
 if(7==choice){cout<<"    !!!"<<endl;break;}
 switch(choice)
 {
 case 1:{
		 Add();
		 }break;
	case 2:{
		 Delete();
		 }break;
	case 3:{
		 Sort();
		 }break;
	case 4:{
		 Showfront();
		 }break;
	case 5:{
		 Showend();
		 }break;
	case 6:{
		 Display();
		 }break;
	default:cout<<"    !!!"<<endl;
 }
 }
 return 0;
}
결과 캡 처:

끝부분

위치

학 번 에 따라 삭제 하 다

성적 에 따라 순 서 를 올리다.

학 번 에 따라 순 서 를 내리다.

마지막 요소 보이 기
나머지 기능 은 독자 가 원 코드 를 복사 하여 자체 적 으로 검증 하 시기 바 랍 니 다.
주의:
1.end()함 수 는 끝 요 소 를 되 돌려 주 는 다음 이 고 비어 있 습 니 다.
2.역 주 행 시 reverseiterator,iterator 를 사용 할 수 없습니다.교체 기 가 없습니다-
3.정렬 시 예상 함수 의 작성 에 주의
추가 지식:C++STL list 의 초기 화,추가,옮 겨 다 니 기,삽입,삭제,찾기,정렬,방출
list 는 C++표준 모듈 라 이브 러 리(STL,Standard Template Library)의 일부 내용 입 니 다.
실제로 list 용 기 는 양 방향 링크 로 삭제 요 소 를 효율적으로 삽입 할 수 있다.
list 용 기 를 사용 하기 전에 STL 의 list 용기 의 헤더 파일 을 추가 해 야 합 니 다:
#include;
list 는 std 이름 필드 의 내용 에 속 하기 때문에 이름 을 통 해 한정 해 야 합 니 다.
using std::list;
전역 적 인 네 임 스페이스 방식 도 직접 사용 할 수 있 습 니 다.
using namespace std;
(1)초기 화

typedef struct info_s
{
int nNumber; 
}info_t; 
typedef std::list< info_t > list_t;
list 형식 정의

list_t List; //        
list_t List(count); //    count     0      
list_t List(count, info); //    count     info      
list_t List(List2); //    copy  
list_t List(List2.begin(),List2.end()); //      [First,Last]
(2)추가(끝 에 추가)

info_t info;
//Set(info) 
List.push_back(info);
끝 에 추 가 됩 니 다.
(3)옮 겨 다 니 기

list_t::iterator iter;
for(iter = List.begin(); iter != List.end() ;iter++)
{
std::cout<< iter->nNumber <<std::endl;
}
(4)끝 요소 삭제
c++의 stl list 제공 popback()함수 로 마지막 요 소 를 삭제 합 니 다.
List.pop_back();
(5)모든 요소 삭제
간단 하고 거 친 방법:clear()호출
List.clear();
삭제 법 을 옮 겨 다 니 며 하나씩 삭제 하 는 장점 은 요소 가 신청 내용 이나 시스템 자원 이 있 으 면 우 리 는 그 를 풀 어 자원 유출 을 피 할 수 있다 는 것 이다.

list_t::iterator iter;
for(iter = List.begin(); iter != List.end() ;)
{
//                
//
iter = List.erase(iter); 
//iter        
}
 
(6)삽입
iter = List.insert(iter , info);
삽입 후 iter 는 새로 삽 입 된 요 소 를 가리 키 고 있 습 니 다.
(7)찾기

list_t::iterator iter ;
iter = std::find(List.begin(),List.end(), info);
if(iter != List.end())
{
std::cout<<"find it"<<std::endl;
}
else
{
std::cout<<"not find it"<<std::endl;
}
구조 체 에 과부하 가 필요 합 니 다.
(8)정렬
List.sort();
주의,구조 체 는 연산 자 를 다시 불 러 와 야 합 니 다<
상위 코드

#include <iostream>
#include <list>
#include <algorithm> 
#include <stdlib.h>
#include <string.h>
 
typedef struct info_s
{
 int nNumber;
 bool operator==(struct info_s b) const 
 { 
 return this->nNumber == b.nNumber; 
 } 
 
 bool operator!=(struct info_s b) const 
 { 
 return this->nNumber != b.nNumber; 
 } 
 
 bool operator>=(struct info_s b) const 
 { 
 return this->nNumber >= b.nNumber; 
 } 
 
 bool operator<=(struct info_s b) const 
 { 
 return this->nNumber <= b.nNumber; 
 } 
 
 bool operator>(struct info_s b) const 
 { 
 return this->nNumber > b.nNumber; 
 } 
 
 bool operator<(struct info_s b) const 
 { 
 return this->nNumber < b.nNumber; 
 } 
}info_t;
 
typedef std::list< info_t > list_t; 
void append(list_t &List, info_t &info)
{
 std::cout<<"***append****"<<std::endl;
 List.push_back(info);
}
 
void for_each(list_t &List)
{
 std::cout<<"***for_each****"<<std::endl;
 list_t::iterator iter;
 for(iter = List.begin(); iter != List.end() ;iter++)
 {
 std::cout<< iter->nNumber <<std::endl;
 }
}
 
void del_end_info(list_t &List)
{
 std::cout<<"***del_end_info****"<<std::endl;
 if(! List.empty())
 {
 List.pop_back();
 }
}
 
void for_each_delete(list_t &List)
{
 list_t::iterator iter;
 for(iter = List.begin(); iter != List.end() ;)
 {
 std::cout<< "delete before iter->number:"<<iter->nNumber <<std::endl;
 iter = List.erase(iter);
 std::cout<< "delete after iter->number:"<< iter->nNumber <<std::endl;
 } 
} 
 
int insert_one(list_t &List , info_t &info, int iPlace) 
{ 
 int i = 0; 
 std::cout<<"insert_one"<<std::endl; 
 if(iPlace < 0) 
 { 
 std::cout<<"insert_one param error"<<std::endl; 
 return -1; 
 } 
 
 list_t::iterator iter = List.begin();
 
 while(iter != List.end()) 
 { 
  //std::cout<<" dump "<< (*iVector)<<std::endl; 
  if(i == iPlace) 
  { 
  iter = List.insert(iter , info); //  insert        ,     iVector        
  std::cout<<" insert_one after List point "<<iter->nNumber <<std::endl; 
  return 0; 
  } 
  
  i++; 
  ++iter; 
 } 
 
 iter = List.insert(List.end() , info); 
 return 0; 
} 
 
void find_one(list_t &List,info_t info )
{
 
 std::cout<<"find_one"<<std::endl; 
 
 list_t::iterator iter ;
 
 iter = std::find(List.begin(),List.end(), info);
 
 if(iter != List.end())
 {
 std::cout<<"find it"<<std::endl; 
 }
 else
 {
 std::cout<<"not find it"<<std::endl; 
 } 
}
 
void Sort(list_t & List)
{
 std::cout<<"Sort it"<<std::endl; 
 List.sort();
 for_each(List);
}
 
int main()
{
 //   
 list_t List;
 info_t info;
 memset(&info, 0, sizeof(info_t));
 
 //  
 info.nNumber = 8;
 append(List, info);
 
 info.nNumber = 5;
 append(List, info);
 
 info.nNumber = 7;
 append(List, info);
 
 info.nNumber = 1;
 append(List, info);
 
 info.nNumber = 1;
 append(List, info);
 
 info.nNumber = 2;
 append(List, info);
 
 info.nNumber = 1;
 append(List, info);
 
 //  
 for_each(List);
 
 //  
 info.nNumber = 80;
 insert_one(List,info,3);
 for_each(List);
 //  
 find_one(List,info);
 
 //  
 Sort(List);
 
 //    
 del_end_info(List);
 for_each(List);
 
 std::cout<< " size:"<<List.size()<<std::endl; 
 
 //    
// List.clear();
 for_each_delete(List);
 for_each(List);
 std::cout<< " size:"<<List.size()<<std::endl; 
 return 0;
}
이상 의 c++STL 의 list 는 구조 체 의 증가,삭제,정렬 등 조작 에 대한 상세 한 설명 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 될 수 있 고 많은 응원 을 바 랍 니 다.

좋은 웹페이지 즐겨찾기