C++에서 쌍으로 구성된 벡터 정렬

Jinku Hu 2023년10월12일
  1. std::sort알고리즘을 사용하여 C++에서 첫 번째 요소 값으로 쌍의 벡터 정렬
  2. Lambda 표현식과 함께std::sort알고리즘을 사용하여 C++에서 두 번째 요소 값으로 쌍의 벡터 정렬
  3. 사용자 지정 함수와 함께std::sort알고리즘을 사용하여 C++에서 쌍의 벡터 정렬
C++에서 쌍으로 구성된 벡터 정렬

이 기사에서는 C++에서 쌍의 벡터를 정렬하는 방법을 설명합니다.

std::sort알고리즘을 사용하여 C++에서 첫 번째 요소 값으로 쌍의 벡터 정렬

쌍은 C++ 표준 템플릿 라이브러리에서 별도의 클래스로 제공됩니다. 두 개의 이기종 객체를 하나의 단위로 저장하는 유형을 구현합니다. std::pair알고리즘은 본질적으로 두 개의 요소 만있는 튜플과 유사한 데이터 구조입니다.

쌍 객체는 각 요소의 유형을 지정하는 두 개의 템플릿 매개 변수로 선언됩니다. 쌍 선언을 벡터 템플릿 매개 변수로 배치하여pair객체의 벡터를 선언 할 수 있습니다. 다음 코드 스 니펫에 설명 된대로 각 쌍을 별도의 중괄호로 전달하여 이니셜 라이저 목록으로 쌍 벡터를 초기화 할 수 있습니다.

STL에서 제공하는 일반 정렬 알고리즘을 사용하여 쌍의 벡터를 정렬 할 수 있습니다. std::sort함수는 정렬 할 범위의 두 반복자를 취하고 기본적으로 내림차순이 아닌 순서로 요소를 재 배열합니다. 쌍의 경우 벡터는 각 쌍의 첫 번째 요소를 기준으로 정렬됩니다.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << "{" << item.first << "," << item.second << "}"
         << "; ";
  }
  cout << endl;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVector(vec1);

  std::sort(vec1.begin(), vec1.end());

  cout << "vec1: ";
  printVector(vec1);

  return EXIT_SUCCESS;
}

출력:

vec1: {12,eleven}; {32,thirty-two}; {6,six}; {43,forty-three};
vec1: {6,six}; {12,eleven}; {32,thirty-two}; {43,forty-three};

Lambda 표현식과 함께std::sort알고리즘을 사용하여 C++에서 두 번째 요소 값으로 쌍의 벡터 정렬

또는 선택적인 비교 함수 객체를std::sort알고리즘에 전달하면 두 번째 요소 값으로 주어진 쌍 벡터를 정렬 할 수 있습니다. 이 경우 람다 식을 사용하여 함수 객체를 형성하고sort함수 호출의 세 번째 인수로 전달합니다. 이것은 본질적으로 쌍의 요소에 대한 사용자 지정 비교 루틴을 정의하는 방법입니다.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << "{" << item.first << "," << item.second << "}"
         << "; ";
  }
  cout << endl;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVector(vec1);

  std::sort(vec1.begin(), vec1.end(),
            [](const auto &x, const auto &y) { return x.second < y.second; });

  cout << "vec1: ";
  printVector(vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

출력:

vec1: {12,eleven}; {32,thirty-two}; {6,six}; {43,forty-three};
vec1: {12,eleven}; {43,forty-three}; {6,six}; {32,thirty-two};

사용자 지정 함수와 함께std::sort알고리즘을 사용하여 C++에서 쌍의 벡터 정렬

비교 함수를std::sort알고리즘에 전달하는 또 다른 방법은bool cmp(const Type1 &a, const Type2 &b)형식으로 별도의 함수를 정의하는 것입니다. 일반적으로std::sort에는O(nlogn)실행 시간 복잡도가 있습니다.

다음 예제는 각 쌍의 첫 번째 요소를 비교하는sortPairs함수를 정의합니다. 그러나 사용자 지정 클래스 개체를 저장하는 쌍에 대해 더 복잡한 비교 함수를 정의하거나 여러 데이터 멤버를 평가해야하는 경우에 정의 할 수 있습니다.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << "{" << item.first << "," << item.second << "}"
         << "; ";
  }
  cout << endl;
}

bool sortPairs(const pair<int, string> &x, const pair<int, string> &y) {
  return x.first > y.first;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVector(vec1);

  std::sort(vec1.begin(), vec1.end(), sortPairs);

  cout << "vec1: ";
  printVector(vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

출력:

vec1: {12,eleven}; {32,thirty-two}; {6,six}; {43,forty-three};
vec1: {43,forty-three}; {32,thirty-two}; {12,eleven}; {6,six};
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Vector