Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 벡터에서 부분 벡터(Subvector) 추출하는 방법

C++에서 부분 벡터(subvector)란 기존 벡터에 들어 있는 요소 중 일부만을 담고 있는 새로운 벡터를 의미합니다. 이 글에서는 std::vector가 제공하는 범위 기반 생성자와 반복자(iterator)를 활용하여, 벡터의 특정 구간을 잘라내어 새로운 벡터를 만드는 방법을 알아보겠습니다.

핵심 아이디어

std::vector는 시작 반복자와 끝 반복자 두 개를 인자로 받는 생성자를 제공합니다. 이 생성자를 사용하면 원본 벡터의 특정 범위에 해당하는 요소들을 그대로 복사한 새로운 벡터를 간단하게 만들 수 있습니다.

  • v.begin() + m : 인덱스 m부터 시작하는 반복자
  • v.begin() + n + 1 : 인덱스 n까지 포함하기 위한 끝 반복자 (끝 반복자는 마지막 요소의 다음 위치를 가리키므로 n + 1을 사용)

알고리즘

시작
  벡터의 시작 위치와 끝 위치를 생성자에 전달하기 위해
  s를 vector s(vector const &v, int m, int n)로 선언한다.
    auto first = v.begin() + m
    auto last = v.begin() + n + 1
  vector 타입의 변수 vector를 선언한다.
    벡터의 first 위치와 last 위치 값을 전달한다.
  vector를 반환한다.
  템플릿 T를 선언한다.
  함수 show()를 선언한다.
    벡터 v를 매개변수로 전달한다.
    for (auto i : v)
      변수 i의 값을 출력한다.
  벡터 v를 선언한다.
    v 벡터에 초기값을 설정한다.
    두 변수 a = 3, b = 6을 초기화한다.
    "Sub vector is:"를 출력한다.
  또 다른 벡터 sub_vector를 선언한다.
    vector sub_vector = s(v, a, b)를 통해 벡터 v의 시작 위치와
    끝 위치를 지정하여 부분 벡터의 값을 초기화한다.
  show() 함수를 호출하여 sub_vector의 값을 화면에 표시한다.
끝.

예제 코드

#include <iostream>
#include <vector>
using namespace std;

template<typename T>
vector<T> s(vector<T> const &v, int m, int n) {
    auto first = v.begin() + m;
    auto last = v.begin() + n + 1;
    vector<T> vector(first, last);
    return vector;
}

template<typename T>
void show(vector<T> const &v) {
    for (auto i: v) {
        cout << i << ' ';
    }
    cout << '\n';
}

int main() {
    vector<int> v = {7,6,2,4,1,9,10,15,17};
    int a = 3, b = 6;
    cout << "Sub vector is:" << endl;
    vector<int> sub_vector = s(v, a, b);
    show(sub_vector);
    return 0;
}

실행 결과

Sub vector is:
4 1 9 10

코드 설명

함수 s()는 원본 벡터 v를 상수 참조(const reference)로 받아 원본을 수정하지 않으면서, 인덱스 m부터 n까지의 요소로 구성된 새로운 벡터를 반환합니다. 예제에서는 인덱스 3부터 6까지의 요소를 추출했으므로, 결과 벡터에는 4 1 9 10이 순서대로 저장됩니다.

템플릿을 사용했기 때문에 이 함수는 int뿐 아니라 double, string 등 다양한 타입의 벡터에도 동일하게 적용할 수 있다는 장점이 있습니다. 또한 새로운 벡터가 생성되는 방식이므로 원본 벡터는 전혀 영향을 받지 않습니다.