[알고리즘] sort with STL, c++ 람다함수
2019. 8. 31. 12:50ㆍProgramming/C++
1. 구조체를 활용한 Sort
기본적인 sort
보통 우리가 기본적으로 사용하던 sort는 2개의 인자를 사용했지만,
사실은 마지막에는 classfunction 의 자리이고,
디폴트 값으로 less 가 숨어있어 일반적인 sort(A.begin(), A.end()); 의 형식으로 사용 시 오름차순으로 정렬해주었던것이다.
sort(A.begin(), A.end(), classfunction);
뜯어보면
sort(A.begin(), A.end(), less); //오름차순
sort(A.begin(), A.end(), greater); //내림차순
코드로 이해해보자!
#struct+person.cpp
#include "stdio.h"
#include
#include
#include
using namespace std;
struct Person
{
int age;
int height;
int weight;
Person(int age, int height, int weight){
this->age = age;
this->height= height;
this->weight = weight;
}
};
bool cmpByAgeUp(Person a, Person b){
//오름차순
if(a.age < b.age){
return true;
} else {
return false;
}
}
bool cmpByAgeDown(Person a, Person b){
//내림차순
if(a.age > b.age){
return true;
} else {
return false;
}
}
int main(){
Person psn1(10, 23, 42);
Person psn2(23, 56, 36);
Person psn3(14, 234, 2928);
//cout << "age, height, weight : " << psn1.age <<" "<< psn1.height <<" "<< psn1.weight<<endl;
vector contact;
contact.push_back(psn1);
contact.push_back(psn2);
contact.push_back(psn3);
cout <<"--age 오름차순--" << endl;
sort(contact.begin(), contact.end(), cmpByAgeUp);
for(int i = 0; i<(int)contact.size() ; i++){
cout << contact[i].age <<", "<<contact[i].height<<", " <<contact[i].weight<< endl;
}
cout < sort(contact.begin(), contact.end(), cmpByAgeDown);
for(int i =0 ; i<(int)contact.size(); i++){
cout << contact[i].age << ", "<<contact[i].height<<", " <<contact[i].weight<< endl;
}
cout < sort(contact.begin(), contact.end(), [](Person a, Person b){ //밖의 값을 참ㅁ조하고싶으면 [&] (param) {} 이렇게 사용하면 됨
//함수의 내용을 쓰면 됨
if(a.age < b.age){
return true;
} else {
return false;
}
}
);
for(int i =0 ; i<(int)contact.size(); i++){
cout << contact[i].age << ", "<<contact[i].height<<", " <<contact[i].weight<< endl;
}
return 0;
}
2. 람다함수의 활용
: 일회용 함수라고 생각하면 편함.
한번 실행 후 바로 소거됨
[변수 캡쳐](받을인자 ) -> 리턴타입{함수}(넘길인자)
C++에서의 람다함수는 모던 C++의 종류 중 하나이며,
모던 자바스크립트와 같은 행보를 걷는다.
꽤나 효율적인 재미있는 함수인듯 하다 💡
모던C++에 관한 설명은 링크
//기본형 : param a에 속하는 성분들만 사용 가능
[] (param a) { function; }
//param 이외에도, 모든 변수를 참조형으로 받기
[&] (param a) { function; }
//cf. 전역변수는 캡쳐해줄 필요 없음
3. 예제
/* Copyright (c) 2019, Pongsoyun
Global Media Of Soongsil Univ.
This file is licenced under a Creative Commons license:
https://github.com/pongsoyun
*/
//No. 11650
#include "stdio.h"
#include
#include
#include
using namespace std;
int N; //input N
int a=0, b=0; //input a, b
struct Cord{ //Coordinate
int x;
int y;
Cord(int x, int y){
this->x = x;
this->y = y;
}
};
int main(){
cin >> N;
//Coordinate Array
vector arrVec;
for(int i =0 ;i<N; i++){
cin >> a >> b;
arrVec.push_back(Cord(a,b));
}
//sort (x,y)
sort(arrVec.begin(), arrVec.end(), [](Cord a, Cord b){
if(a.x==b.x){
if(a.y<b.y){
return true;
}else{
return false;
}
}else if(a.x < b.x){
return true;
}else {
return false;
}
});
for(int i =0 ;i<(int)arrVec.size(); i++){
cout << arrVec[i].x <<" " <<arrVec[i].y << "\n";
}
return 0;
}
접근법
sort 함수의 3번째 param을 활용하여 푼다
'Programming > C++' 카테고리의 다른 글
GC(Garbage Collection), Native Code vs Managed Code (0) | 2019.09.09 |
---|---|
BFS(Breadth-First Search), DFS(Depth-First Search) 관련 실수 및 풀이 (0) | 2019.09.02 |