C++의 STL 알고리즘

Jinku Hu 2023년10월12일
  1. std::sort 알고리즘을 사용하여 C++에서 일반 벡터 범위 정렬
  2. std::reverse 알고리즘을 사용하여 C++에서 요소 순서 반전
  3. std::accumulate 알고리즘을 사용하여 C++ 범위의 요소 합 계산
  4. std::count 알고리즘을 사용하여 C++에서 특정 기준을 충족하는 요소 수 계산
C++의 STL 알고리즘

이 기사에서는 C++의 STL 알고리즘 라이브러리에서 몇 가지 기능을 소개합니다.

std::sort 알고리즘을 사용하여 C++에서 일반 벡터 범위 정렬

std::sort는 STL에서 가장 많이 사용되는 알고리즘 중 하나입니다. 여러 오버로드가 있으며 그 중 가장 간단한 것은 LegacyRandomAccessIterator 요구 사항을 충족하고 요소를 내림차순으로 정렬하는 두 개의 반복자를 허용합니다. 후자는 동일한 요소의 순서가 보존된다는 보장이 없기 때문이라고 합니다.

std::sort는 일반적으로 vector 범위에서 사용됩니다. 다음 코드 스니펫은 그러한 사용법을 보여줍니다. 알고리즘은 요소 쌍을 평가하고 그에 따라 범위를 정렬하는 데 사용되는 비교 기능을 선택적으로 사용할 수 있습니다.

다음 예는 STL 함수 객체인 std::greater가 비교 함수로 전달되는 한 줄을 보여줍니다. 또는 사용자 정의 함수 객체를 정의하거나 람다 표현식을 std::sort의 세 번째 매개변수로 직접 지정할 수 있습니다.

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

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

template <typename T>
void printRange(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};

  std::sort(v1.begin(), v1.end());
  printRange(v1);

  std::sort(v1.begin(), v1.end(), std::greater<>());
  printRange(v1);

  std::sort(v1.begin(), v1.end(), [](int a, int b) { return (a - 2) != b; });
  printRange(v1);

  return EXIT_SUCCESS;
}

출력:

1, 3, 5, 9, 10, 11, 13, 20,
20, 13, 11, 10, 9, 5, 3, 1,
1, 3, 5, 9, 10, 11, 13, 20

std::reverse 알고리즘을 사용하여 C++에서 요소 순서 반전

std::reversevector, list 또는 deque와 같은 시퀀스 컨테이너의 내용을 뒤집는 데 사용할 수 있습니다. 이 함수는 두 개의 반복자 매개변수를 허용하며 모든 일반 유형에서 작동할 수 있습니다. 다음 코드 샘플은 정수의 ‘벡터’와 문자열의 ‘목록’이 반전되는 두 가지 시나리오를 보여줍니다. 또한 std::reverse 알고리즘을 호출하기 전에 sort 멤버 함수를 사용하여 list 객체를 정렬합니다. std::sort 알고리즘은 std::list 컨테이너에서 작동하지 않습니다.

#include <algorithm>
#include <iostream>
#include <list>
#include <string>
#include <vector>

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

template <typename T>
void printRange(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << ", ";
  }
  cout << endl;
}

template <typename T>
void printRange(std::list<T> v) {
  for (const auto &item : v) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};
  std::list<string> l1 = {"htop", "wtop", "rtop", "ktop", "ktop", "ptop"};

  std::reverse(v1.begin(), v1.end());
  printRange(v1);

  l1.sort();
  std::reverse(l1.begin(), l1.end());
  printRange(l1);

  return EXIT_SUCCESS;
}

출력:

20, 13, 10, 9, 11, 5, 3, 1,
wtop, rtop, ptop, ktop, ktop, htop,

std::accumulate 알고리즘을 사용하여 C++ 범위의 요소 합 계산

std::accumulate는 주어진 범위의 모든 요소에 대해 일반적인 산술 연산을 수행하는 데 사용할 수 있는 숫자 알고리즘의 일부입니다. 이 경우 주어진 알고리즘은 범위에 있는 각 요소의 총합을 계산합니다. std::accumulate에는 두 개의 오버로드가 있으며, 첫 번째는 범위 자체를 나타내는 두 개의 반복자와 합계의 시작 값을 나타내는 init 값을 사용합니다. 두 번째 오버로드는 선택적으로 합산 대신 적용된 네 번째 매개 변수로 함수 개체를 사용할 수 있습니다.

#include <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <vector>

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

int main() {
  std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};

  auto sum = std::accumulate(v1.begin(), v1.end(), 0);
  cout << "Sum of 'v1' vector = " << sum << endl;

  sum = std::accumulate(v1.begin(), v1.end(), 1, std::multiplies());
  cout << "Accumulate of 'v1' vector = " << sum << endl;

  return EXIT_SUCCESS;
}

출력:

Sum of 'v1' vector = 72
Accumulate of 'v1' vector = 3861000

std::count 알고리즘을 사용하여 C++에서 특정 기준을 충족하는 요소 수 계산

std::count 함수는 주어진 범위의 특정 요소를 계산하는 유용한 방법입니다. 즉, 범위 반복자와 을 전달하여 주어진 값과 동일한 모든 요소를 ​​일치시킬 수 있습니다. 다른 오버로드는 유효한 일치를 평가하고 알고리즘이 그에 따라 카운트 번호를 검색하는 단항 조건자를 허용할 수 있습니다. 다음 예에서는 vector 객체의 짝수를 계산하는 람다 식을 지정했습니다.

#include <algorithm>
#include <iostream>
#include <list>
#include <numeric>
#include <string>
#include <vector>

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

int main() {
  std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};

  auto count_10 = std::count(v1.begin(), v1.end(), 10);
  cout << count_10 << " occurrences of number 10" << endl;

  auto count_even =
      std::count_if(v1.begin(), v1.end(), [](int i) { return i % 2 == 0; });
  cout << count_even << " even numbers in 'v1' vector" << endl;

  return EXIT_SUCCESS;
}

출력:

1 occurrences of number 10
2 even numbers in 'v1' vector
작가: 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++ Algorithm