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 등 다양한 타입의 벡터에도 동일하게 적용할 수 있다는 장점이 있습니다. 또한 새로운 벡터가 생성되는 방식이므로 원본 벡터는 전혀 영향을 받지 않습니다.