본문으로 바로가기

벡터를 이용하여 데이터를 다룰 때 sort 함수를 이용한 정렬을 매우 빈번하게 사용한다. 하지만 단순히 오름차순이나 내림차순이 아닌 원하는 조건에 맞게 입맛대로 정렬하고 싶을 때가 있는데 이때 사용자 정의 함수를 별도로 정의해서 사용할 수 있다.

임의의 예제로 무작위 문자열을 입력 받은 벡터가 있다고 해보자. 이를 가능하면 문자열의 길이가 짧은 순서대로, 문자열의 길이가 같다면 알파벳 순으로 정렬하고 싶을 떄 아래와 같이 비교 함수를 정의할 수 있다.

struct compare {// custom compare function
  bool operator() (const string& lhs, const string& rhs) const {
    if (lhs.size() == rhs.size()) {
      return lhs < rhs;
    }
    return lhs.size() < rhs.size();
  }
};

정렬을 하고 싶으면 sort 함수의 3번째 인자에 해당 함수를 넣어주기만 하면 된다.

vector<string> v;
sort(v.begin(), v.end(), compare());

예제를 통해 확인해보자.

#include <cstdio>
#include <string>
#include <vector>
using namespace std;

struct compare {// custom compare function
  bool operator() (const string& lhs, const string& rhs) const {
    if (lhs.size() == rhs.size()) {
      return lhs < rhs;
    }
    return lhs.size() < rhs.size();
  }
};

int main() {
  string s[] = {
    "if", "you", "do", "not", "walk", "today",
    "you", "will", "have", "to", "run", "tommorrow"
  };
  vector<string> v(s, s + (sizeof(s) / sizeof(*s)));
  
  printf("Before sorting:\n");
  for (auto e: v) {
    printf("%s ", e.c_str());
  }
  puts("");
  
  sort(v.begin(), v.end(), compare());// sort a vector with custom compare function
  
  printf("After sorting:\n");
  for (auto e: v) {
    printf("%s ", e.c_str());
  }
  puts("");
  
  return 0;
}

결과는,

Before sorting:
if you do not walk today you will have to run tommorrow 
After sorting:
do if to not run you you have walk will today tommorrow

댓글을 달아 주세요