c++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 는 구조 체 의 증가,삭제,정렬 등 조작 에 대한 상세 한 설명 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 될 수 있 고 많은 응원 을 바 랍 니 다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1717 소수 화 점수 2 (수학)소수 화 점수 2 레이 는 수학 시간 에 선생님 의 말씀 을 듣 고 모든 소수 가 점수 로 표시 되 는 형식 이 라 고 말 했다. 그 는 녹 기 시 작 했 고 곧 완성 되 었 다. 그러나 그 는 또 하나의 문 제 를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.