c+++STLのリスト構造体の増加、削除、ソートなどの操作について詳しく説明します。
STLの中のlistをさらに勉強して、プログラミングする過程で構造体に対する操作が多いです。
すべてのコードは以下の通りです。
尾部に某を追加する
ある位置に
学号で削除
成績順に昇順する
学号によって降順する
最後の要素を表示
残りの機能は元のコードをコピーして、自分で検証してください。
注意:
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)初期化
(3)遍歴
c+++のstl listはpop_を提供します。バック関数は最後の要素を削除します。
List.pop_back();
(5)すべての要素を削除する
簡単で乱暴な方法:clearを呼び出す()
List.clear()
削除法を巡回して、削除するという利点は、もし要素に申請内容やシステム資源があれば、彼を解放して、資源の流出を避けることができます。
iter=List.insert;
挿入後iterは、新しく挿入された要素を指します。
(7)検索
(8)並べ替え
List.sort()
構造体は演算子を積載する必要があります。
コードを付ける
すべてのコードは以下の通りです。
/*
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のリストは構造体の増加、削除、ソートなどの操作の詳細は、小編集が皆さんに共有した内容の全部です。