C++에서 STL 유틸리티를 사용하는 역방향 벡터 요소

Jinku Hu 2023년10월12일
  1. std::reverse알고리즘을 사용하여 C++에서 벡터 요소 반전
  2. std::shuffle알고리즘을 사용하여 C++에서 무작위로 벡터 요소 재정렬
  3. std::rotate알고리즘을 사용하여 C++에서 벡터 요소 회전
C++에서 STL 유틸리티를 사용하는 역방향 벡터 요소

이 기사에서는 C++에서 STL 유틸리티를 사용하여 벡터 요소를 반전하는 방법을 소개합니다.

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

std::reverse는 STL 알고리즘의 일부이며 주어진 범위에서 요소의 순서를 바꾸는 데 사용할 수 있습니다. std::reverse 알고리즘은 내부적으로 첫 번째와 마지막 쌍에서 시작하는 두 요소를 교환합니다. std::reverse는 주어진 범위의 반복자를 나타내는 두 개의 인수를 사용합니다. 다음 예제에서는 임의의 정수를vector 객체로 생성합니다.이 객체는std::reverse 알고리즘을 사용하여 반전되고 결과를cout 스트림에 출력합니다.

#include <iomanip>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>

using std::cout;
using std::endl;
using std::left;
using std::setw;

void generateNumbers(std::vector<int> &arr, size_t &width) {
  std::srand(std::time(nullptr));
  for (size_t i = 0; i < width; i++) {
    arr.push_back(std::rand() % 100);
  }
}

int main() {
  size_t width = 10;
  std::vector<int> arr;
  arr.reserve(width);

  generateNumbers(arr, width);

  cout << left << setw(10) << "arr: ";
  copy(arr.begin(), arr.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  std::reverse(arr.begin(), arr.end());

  cout << left << setw(10) << "arr: ";
  copy(arr.begin(), arr.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  return EXIT_SUCCESS;
}

출력:

arr:      78; 56; 63; 59; 16; 7; 54; 98; 87; 92;
arr:      92; 87; 98; 54; 7; 16; 59; 63; 56; 78;

std::shuffle알고리즘을 사용하여 C++에서 무작위로 벡터 요소 재정렬

std::shuffle은 각 요소의 순열이 동일한 확률을 갖도록 범위의 요소를 무작위로 재정렬하는 데 사용할 수 있습니다. 이 함수는 범위의 시작 및 종료 반복기를 나타내는 두 개 이상의 인수를 사용합니다. 선택적으로std::shuffle은 난수 생성기 함수를 나타내는 세 번째 인수를 사용할 수 있습니다. 이 경우<random>헤더 아래에 제공되는mersenne_twister_engine을 활용했습니다.

#include <iomanip>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>

using std::cout;
using std::endl;
using std::left;
using std::setw;

void generateNumbers(std::vector<int> &arr, size_t &width) {
  std::srand(std::time(nullptr));
  for (size_t i = 0; i < width; i++) {
    arr.push_back(std::rand() % 100);
  }
}

int main() {
  size_t width = 10;
  std::vector<int> arr;
  arr.reserve(width);

  generateNumbers(arr, width);

  cout << left << setw(10) << "arr: ";
  copy(arr.begin(), arr.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  std::shuffle(arr.begin(), arr.end(), std::mt19937(std::random_device()()));

  cout << left << setw(10) << "arr: ";
  copy(arr.begin(), arr.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  return EXIT_SUCCESS;
}

출력:

arr:      40; 77; 74; 41; 79; 21; 81; 98; 13; 90;
arr:      79; 41; 90; 77; 21; 81; 98; 74; 13; 40;

std::rotate알고리즘을 사용하여 C++에서 벡터 요소 회전

STL 알고리즘에 포함 된 또 다른 유용한 기능은-std::rotate입니다. 이 함수는 요소를 왼쪽으로 이동하고 벡터 경계 외부로 이동 한 요소를 둘러 쌉니다. std::rotateForwardIt반복기 유형의 세 인수를 취하고 두 번째 인수가 가리키는 요소가 새로 생성 된 목록의 첫 번째 위치로 이동되도록 회전을 수행합니다.

#include <iomanip>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>

using std::cout;
using std::endl;
using std::left;
using std::setw;

void generateNumbers(std::vector<int> &arr, size_t &width) {
  std::srand(std::time(nullptr));
  for (size_t i = 0; i < width; i++) {
    arr.push_back(std::rand() % 100);
  }
}

int main() {
  size_t width = 10;
  std::vector<int> arr;
  arr.reserve(width);

  generateNumbers(arr, width);

  cout << left << setw(10) << "arr: ";
  copy(arr.begin(), arr.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  std::rotate(arr.begin(), arr.begin() + (width / 2), arr.begin() + width);

  cout << left << setw(10) << "arr: ";
  copy(arr.begin(), arr.end(), std::ostream_iterator<int>(cout, "; "));
  cout << endl;

  return EXIT_SUCCESS;
}

출력:

arr:      75; 16; 79; 62; 53; 5; 77; 50; 31; 54;
arr:      5; 77; 50; 31; 54; 75; 16; 79; 62; 53;
작가: 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