c+++STLのリスト構造体の増加、削除、ソートなどの操作について詳しく説明します。


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.リバース遍歴時にリバース_iterator、iteratorは使えません。
3.注意並べ替え時の事前判定関数の作成
補足知識:C++STLリストの初期化、追加、遍歴、挿入、削除、検索、ソート、リリース
listはC++標準テンプレートライブラリ(STL,Standard Template Library)の一部です。
実際には、list容器は双方向リンク表であり、削除要素を効率的に挿入することができます。
リスト容器を使う前にSTLのリスト容器のヘッダファイルを追加しなければなりません。
ヽoo。ツ
リストはstd命名ドメインの内容ですので、ネーミングによって限定される必要があります。
using std:list;
グローバルの名前空間方式を直接使用することもできます。
using namespace std
(1)初期化

typedef struct info_s
{
int nNumber; 
}info_t; 
typedef std::list< info_t > list_t;
リストのタイプを定義します

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はpop_を提供します。バック関数は最後の要素を削除します。
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は、新しく挿入された要素を指します。
(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のリストは構造体の増加、削除、ソートなどの操作の詳細は、小編集が皆さんに共有した内容の全部です。