C++의 std::back_inserter 함수 템플릿

Jinku Hu 2023년10월12일
  1. std::back_inserter를 사용하여 컨테이너 끝에 요소를 추가하는 반복자 생성
  2. std::set_intersection 알고리즘과 함께 std::back_inserter 사용
C++의 std::back_inserter 함수 템플릿

이 기사에서는 C++에서 std::back_inserter 함수 템플릿을 활용하는 방법을 설명합니다.

std::back_inserter를 사용하여 컨테이너 끝에 요소를 추가하는 반복자 생성

일반적으로 반복자는 다양한 컨테이너 유형에 액세스할 수 있는 공통 인터페이스를 제공합니다. 사실, 이 인터페이스는 STL 알고리즘에 의해 철저히 활용됩니다. 그러나 각 컨테이너는 일반적으로 내부 데이터 구조에 적합한 사용자 지정 동작을 구현합니다.

또한 공통 반복자 인터페이스 위에 특별한 기능을 제공하는 반복자 어댑터 개념이 있습니다. 즉, 반복자 어댑터를 나타내는 삽입 반복자는 요소 할당 작업을 삽입으로 대체하고 STL 알고리즘이 해당 요소를 덮어쓰지 않고 지정된 컨테이너에 새 요소를 추가하도록 합니다.

사전 정의된 삽입 반복자는 후면 삽입기, 전면 삽입기 및 일반 삽입기의 세 가지가 있습니다. 이 경우 컨테이너 끝에 요소를 추가하는 백 삽입기를 보여줍니다. 백 삽입기는 push_back 멤버 함수가 있는 컨테이너에 적용될 수 있습니다.

다음 예제 코드는 해당 백 삽입기 반복기를 자동으로 생성하는 std::back_inserter 함수를 사용하여 std::fill_n 알고리즘을 vector 컨테이너에 적용하는 방법을 보여줍니다.

#include <iostream>
#include <iterator>
#include <vector>

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

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

int main() {
  vector<int> v1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

  std::fill_n(std::back_inserter(v1), 2, 100);
  cout << "v1: ";
  printRange(v1);

  return EXIT_SUCCESS;
}

출력:

v1: 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 100; 100;

std::set_intersection 알고리즘과 함께 std::back_inserter 사용

또는 std::back_inserterstd::set_intersection 알고리즘과 함께 사용하여 미리 크기를 예약하지 않고 두 컬렉션의 요소를 대상 컨테이너에 저장할 수 있습니다. 다음 코드 스니펫에서는 std::vector 컨테이너에 메서드를 적용합니다.

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

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

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

int main() {
  vector<int> v1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  vector<int> v2 = {1, 2, 3, 4};

  vector<int> v3;
  std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),
                        std::back_inserter(v3));
  cout << "v3: ";
  printRange(v3);

  return EXIT_SUCCESS;
}

출력:

v3: 1; 2; 3; 4;

또한 후자가 STL 컨테이너 인터페이스를 구현하므로 string 객체와 함께 back_inserter를 사용할 수 있습니다. 따라서 std::set_union 알고리즘의 도움으로 문자열의 일부를 다른 문자열 개체에 추가할 수 있습니다.

#include <algorithm>
#include <iostream>
#include <iterator>

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

int main() {
  string s1("hello");
  string s2("there");
  string s3;

  std::set_union(s1.begin(), s1.end(), s2.begin(), s2.end(),
                 std::back_inserter(s3));
  cout << s3 << endl;

  return EXIT_SUCCESS;
}

출력:

hellothere
작가: 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++ Iterator