이글은 "전문가를 위한 c++(개정4판)"을 학습한 내용을 직접 실습해보며 정리한 Review용 글입니다.
std::array
c++에서는 std::array라는 고정 크기 컨테이너를 제공합니다. 사실 c 스타일 배열 위에 한 꺼풀 덮어 쓴 것에 불과하지만 c 스타일의 배열에 비해 여러가지 장점이 있습니다. 항상 크기를 정확히 알 수 있고, 자동으로 포인터를 캐스팅 하지 않아서 특정한 종류의 버그를 방지할 수 있고, 반복자(이터레이터,iterator)를 사용하면 배열에 원소에 대한 반복문을 쉽게 작성할 수 있습니다. array 컨테이너는 array<int, 3>과 같이 쓸 수 있는데 꺽쇠 안 첫번째 매개변수는 자료형을 나타내고, 두번째 매개변수는 배열의 크기를 나타냅니다. 다음은 array 컨테이너를 사용하는 예를 보여줍니다.
#include <iostream>
#include <array> //std::array를 사용하기 위한 해더
using namespace std;
int main()
{
array<int, 3> arr = { 9, 8, 7 }; //이니셜라이저 리스트로 초기화
cout << "Array size = " << arr.size() << endl; //배열의 크기 출력
cout << "2nd element = " << arr[1] << endl; //두번째 원소값 출력
// 반복자 사용
int sum = 0;
auto start = arr.begin(); //첫번째 원소에 대한 반복자
auto end = arr.end(); //두번째 원소에 대한 반복자
while (start != end) {
sum += *(start++); //반복자를 증가시키면서 그 안에 원소값들을 더한다.
}
cout << sum << endl;
return 0;
}
결과
배열의 크기는 size()함수를 통해 알 수 있고, 배열원소에 접근하는 c스타일 배열과 동일하게 arr[0], arr[1], ... 처럼 인덱스를 통해 접근할 수 있습니다. 또한 begin(), end()함수가 반환하는 반복자를 통해 반복문을 좀 더 수월하게 작성할 수 있습니다.
c스타일 배열과 std::array 둘 다 배열의 크기는 컴파일 시간에 결정되어야 합니다. 실행 도중 늘어나거나 줄어들 수 없습니다. 실행 시간에 동적으로 늘어나는 배열을 쓰고 싶다면 std::vector를 사용하면 됩니다.
std::vector
c++ 표준 라이브러리에서는 저장 공간의 크기가 고정되지 않은 컨테이너를 다양하게 제공합니다. 대표적인 예로는 <vector>헤더파일에 선언되어 있는 std::vector가 있습니다. vector는 프로그래머가 메모리 관리에 신경쓸 필요가 없습니다. 원소를 모두 담을 정도의 메모리를 확보하는 것은 vector가 알아서 하기 때문입니다. vector는 실행시간에 동적으로 원소를 추가하거나 삭제할 수 있습니다. 다음은 벡터를 생성 후 원소를 추가하고 접근하는 기본 기능을 보여주는 예입니다.
#include <iostream>
#include <vector> //std::vector를 사용하기 위한 헤더파일
using namespace std;
int main()
{
//벡터 선언 및 초기화
vector<int> vecA = { 1,2,3,4 };
//벡터에 원소를 추가한다.
vecA.push_back(5);
vecA.push_back(6);
//원소에 접근한다.
cout << "1st element : " << vecA[0] << endl;
return 0;
}
결과
vector는 배열의 크기를 지정하지는 않지만 꺽쇠안에 타입은 반드시 명시해야합니다. 접근은 c스타일 배열처럼 인덱스로 접근할 수 있습니다. 물론 at()함수 같은 다른 접근법도 있으나 여기서는 다루지 않겠습니다(array도 마찬가지). 또한 배열의 원소를 동적으로 추가하려면 push_back()함수를 사용합니다.(emplace_back()같은 다른 함수도 있음)
'Program Language > c++' 카테고리의 다른 글
c++ 기초(반복문(while, do/while, for, 범위 기반 for)) (0) | 2023.01.09 |
---|---|
C++ 기초(구조적 바인딩) (0) | 2023.01.09 |
c++ 기초(C 스타일 배열) (0) | 2023.01.05 |
C++ 기초(함수) (0) | 2023.01.05 |
c++ 기초(논리 연산자) (0) | 2023.01.04 |
댓글