배열 array
배열은 가장 보편적이고 대표적인 자료 구조라고 할 수 있다. 그러나 C언어에서 제공하는 배열은 Compile time이전에 그 크기가 결정되어야한다는 큰 단점이 있다. 이를 해결하기 위한 방법으로 크기를 동적으로 할당하는 방법(malloc 사용 등)이 있지만, 이 방법은 무척 복잡하며 그 인덱스를 직접 관리해야 하므로 의도치 않은 오류가 생길 수 있다.
그러나 C++의 STL에서는 이 문제를 해결하기 위해 array의 속도와 dynamic allocation을 가능하게 하는 Vector라는 타입을 제공한다. 또한 STL에서는 기존 array에 편의성을 추가한 STL만의 array를 제공한다.
몇몇 자료 구조를 간단히 정리하면 아래와 같다.
C-style array : 크기가 정해져 있음. 오래된 스타일
STL array : 사용자의 편의성이 더해짐
STL vector : 한 쪽 방향으로 크기를 늘릴 수 있음
STL deque : 양 쪽 방향으로 크기를 늘릴 수 있음
배열의 특징과 단점
배열은 vector와 달리 크기를 미리 알 수 있는 경우 사용하면 성능이 뛰어나다. 그러나 앞서 설명했듯 C-style 배열은 몇 가지 단점을 가진다.
단점 1. 전체 구조의 조정이 런타임 중 실행되기 때문에 동적인 동작이 불가하다. 이를테면 원소를 삽입하거나 원소를 삭제하는 동작이 불가하며, 이를 빈번히 해야할 경우 전체적 성능이 크게 저하된다.
단점 2. 생성과 소멸에 드는 비용이 크다.
이 단점들을 극복하고자 C++11에서는 std::array가 채택되었다. 이 std::array의 장점으로는 요소들이 스택 공간에 연속적으로 배치된다는 점이 있다. 게다가 std::array는 다른 container와 마찬가지로 생성자, 소멸자, 복사생성자, 대입 연산자를 지원한다.
배열의 원칙
배열은 아래의 두 원칙을 따른다
1 – 동일한 형식을 가진 동일한 물리적 크기의 단위 데이터(c++에서는 이것이 가능하게 해주는 것이 tuple이다)
2 – index parameter에 의해 물리적으로 인접하게 저장
STL의 Array
STL 배열의 사용
STL배열은 #include <array>를 통해 불러온다.
STL 배열의 형태는 아래와 같다.
std::array<type, size>변수명 {엘리먼트1, 엘리먼트2};
std::array<typq,size> 변수명 = {엘리먼트1, 엘리먼트 2}; 의 형태로 사용한다.
여기서 STD array는 class라는 것을 명심하자.
배열의 대입 연산자 사용
std::array는 대입 연산자를 지원한다고 말한 바 있다. 이에 대한 코드는 아래와 같다.
결과값으로 1 2 3이 나오는 것을 확인 할 수 있따. 즉, a1의 각 원소들이 a2에 대입 된 것이다!!
단 배열들의 크기가 같아야한다는 것에 주의
배열의 각종 함수들
STL의 array는 클래스로 구현되어있으며, 각종 함수를 사용 할 수 있도록 지원한다. 해당 함수들은 아래와 같다. 클릭시 예제 코드로 이동한다.
멤버 접근 함수
at, operator[]
두 함수 모두 인자로 전달된 인덱스 값의 원소의 레퍼런스를 리턴한다. at의 경우 입력된 인자가 범위를 벗어났으면 예외를 throw한다.
data
std::array가 참조하는 배열의 시작 주소 값을 리턴한다. 주소값을 리턴하는 데에 주의.
front, back
각각 배열의 첫 원소와 마지막 원소를 리턴한다.
반복자(Iterator) 관련
begin, cbegin
시작점을 나타내는 반복자를 리턴한다. cbegin의 경우 상수 반복자를 리턴한다.
end, cend
요소의 끝을 나타내는 반복자를 리턴한다.
rbegin, crbegin
역참조 반복자의 시작점을 리턴한다.
rend, crend
역참조 반복자의 끝점을 리턴한다
size
배열의 원소 개수를 리턴한다.
기타 작업
fill
배열의 원소들을 해당 함수의 인자로 전달된 값으로 채운다.
swap
두 배열의 내용을 바꾼다,
+배열의 각종 사용 방법
https://doompa.tistory.com/284
'컴퓨터 > 알고리즘:자료구조' 카테고리의 다른 글
[자료구조] C++트리 설명 및 구현(이진트리)/이진트리 구현 (0) | 2022.11.28 |
---|---|
[자료구조] C++ list자료구조 정리/list 함수/list예시 (0) | 2022.11.03 |
[자료구조] C++ vector자료구조 정리/vector 함수 (0) | 2022.10.27 |
[자료구조] c++ 배열(STL Array)의 각종 사용 방법/동적 할당, 함수 파라미터, 2차원 배열 (0) | 2022.10.02 |
[알고리즘] 버블 정렬 정리 및 구현 (0) | 2021.11.30 |
댓글