HOWTO · C++

C++ STL에서 벡터 배열 선언

이 기사에서는 C++에서 벡터 배열을 선언하는 방법을 소개합니다.

이 페이지의 내용

이 가이드에서는 C++에서 벡터의 개수가 고정된 배열과 크기를 조정할 수 있는 벡터의 벡터를 선언하는 방법을 설명합니다. 바깥쪽 컨테이너는 추가할 수 있는 행의 수를 결정하고, 각 안쪽 std::vector는 해당 행에 담을 수 있는 값의 수를 결정합니다. 행 수가 고정되어 있다면 첫 번째 형태를, 바깥쪽 컬렉션을 늘리거나 줄여야 한다면 두 번째 형태를 선택하세요.

고정 배열과 벡터의 벡터 중 선택하기

벡터 배열은 컴파일 시점에 행의 수가 정해지지만, 각 행은 독립적으로 크기를 늘릴 수 있는 벡터입니다. 벡터의 벡터는 행의 수도 변경할 수 있으며 각 행의 길이도 서로 다를 수 있습니다. 따라서 벡터의 벡터가 반드시 직사각형 행렬인 것은 아닙니다. 각 항목에 연결된 이웃의 수가 서로 다를 수 있는 인접 목록 같은 데이터를 표현할 때 유용합니다.

두 형태 모두 벡터를 요소로 저장하므로 안쪽 벡터가 각각 자체 메모리를 관리합니다. 어느 선언 방식도 모든 행의 값 개수가 같다고 보장하지 않습니다. 알고리즘에 직사각형 형태가 필요하다면 각 행을 같은 너비로 초기화하고 데이터를 수정할 때도 그 조건을 유지하세요.

C 스타일 배열 문법으로 벡터 배열 선언하기

행의 수가 고정되어 있다면 요소 형식이 std::vector<int>인 배열을 선언하세요. 예를 들어 std::vector<int> rows[3];은 벡터 요소 세 개를 갖는 배열을 만듭니다. 각 벡터는 처음에 값이 없지만 rows[0].push_back(10)처럼 한 행에 값을 추가할 수 있습니다. 배열 자체는 네 번째 벡터를 담도록 늘릴 수 없습니다. 행의 수를 바꿔야 한다면 크기 조정이 가능한 바깥쪽 컨테이너를 사용하세요.

이 문법은 행의 수가 프로그램 구조상 고정되어 있을 때 유용합니다. 배열의 크기는 선언으로 결정되지만 각 벡터의 크기는 프로그램 실행 중에 바뀔 수 있습니다. 따라서 두 차원에는 서로 다른 규칙이 적용됩니다. 바깥쪽 배열은 고정되어 있고 안쪽 벡터는 크기를 조정할 수 있습니다.

크기를 조정할 수 있는 벡터의 벡터 선언하기

행의 수를 조정할 수 있어야 한다면 std::vector<std::vector<int>>를 사용하세요. 초기화 목록으로 처음 길이가 서로 다른 행을 만들 수 있습니다. 또는 std::vector<std::vector<int>> rows(3, std::vector<int>(2, 0));을 사용하면 각각 0 두 개를 담은 행 세 개가 만들어집니다. 이 생성자 형식에서 첫 번째 인수는 행의 수이고 두 번째 인수는 각 행의 초기값으로 복사되는 벡터입니다.

rows.push_back({8, 9})로 새 행을 추가하거나 rows[0].push_back(7)로 기존 행에 값을 더할 수 있습니다. 한 행을 늘리거나 줄여도 다른 행의 크기가 자동으로 바뀌지는 않습니다. 처음부터 규칙적인 격자를 만들려면 생성자 형식을 사용하고, 행마다 길이가 달라야 한다면 초기화 목록이나 행별 구성을 선택하세요.

벡터의 벡터에 접근하고 반복하기

인덱스가 유효하다고 확신할 수 있을 때는 rows[row][column]으로 값에 바로 접근할 수 있습니다. 각 대괄호 연산은 서로 다른 벡터에 적용됩니다. 첫 번째는 바깥쪽 행을 선택하고 두 번째는 그 행 안의 값을 선택합니다. 행마다 길이가 다를 수 있으므로 한 행에서 유효한 열 인덱스가 다른 행에서는 유효하지 않을 수 있습니다.

범위를 확인하며 접근하려면 rows.at(row).at(column)을 사용하세요. at()은 선택한 벡터의 범위를 벗어난 인덱스를 조용히 처리하지 않고 범위 초과를 보고합니다. 행의 길이가 같다고 가정하지 않고 모든 값을 순회하려면 중첩 범위 기반 반복문을 사용하세요. 반복문에서 내부 값을 참조(int& value)로 받으면 저장된 요소를 수정할 수 있습니다. 읽기만 한다면 값 또는 상수 참조를 사용하세요. 아래의 완전한 예제는 두 가지 선언 방식과 인덱싱, 범위 검사 접근, 값 추가, 참조를 통한 값 수정 방법을 보여줍니다.

아래 완전한 프로그램은 두 컨테이너 형태를 모두 보여주고 각 형태의 값에 접근합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

#include <iostream>
#include <vector>

int main() {
  std::vector<int> fixed_rows[3] = {{1, 2}, {3}, {4, 5, 6}};
  std::vector<std::vector<int>> rows{{1, 2}, {3}, {4, 5, 6}};

  fixed_rows[0].push_back(7);
  rows.push_back({8, 9});
  rows[1].push_back(7);
  rows.at(0).at(1) = 20;

  std::cout << fixed_rows[0][2] << '\n';
  std::cout << rows.at(0).at(1) << '\n';
  for (auto& row : rows) {
    for (int& value : row) {
      value *= 2;
      std::cout << value << ' ';
    }
    std::cout << '\n';
  }
}