C++

C++ 기초(배열)

hellowhales 2023. 1. 19. 18:54
728x90

 

int myArray[3]; // <자료형> <이름>[<크기>]
myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 3;
 
 

-C스타일 배열

 배열은 같은 타입의 값을 나란히 저장하며 각 항목을 배열에 놓인 위치인 인덱스로 접근한다. C++에서는 배열을 선언시 반드시 크기를 지정해야하고 이 때 변수로 지정할 수 없고 상수 또는 상수 표현식으로 지정해야 한다. 또한 배열의 첫번째 원소의 위치는 1이 아닌 0부터 시작한다.

 

배열을 초기화 할 때 다양한 방법으로 초기화가 가능하다.

#include <iostream>

int main()
{
    int myArr1[3] = {0}; // 모든 원소를 0으로 초기화
    int myArr2[3] = {}; // 0을 생략해도 된다. 
    int myArr3[3] = {2}; //첫 번째 원소를 2로 초기화하고 나머지는 0으로 초기화
    int myArr4[] = { 1, 2, 3 } // 이니셜라이저 리스트를 이용한 초기화
    
}
 

C++ 17부터는 std::size()함수를 이용하여 C스타일 배열의 크기를 알아낼 수 있다(<array>헤더를 인클루드해야한다.).

#include <iostream>
#include <array>

int main()
{
    int myArr[3];
    int arraySize1 = std::size(myArr);
    int arraySize2 = sizeof(myArray)/sizeof(myArray[0]); // C++17을 지원하지 않는다면
}
 

배열에 배열이 들어간 형태인 이차원배열과 그 보다 더 나아간 다차원 배열도 지원한다. 기본적인 2차원 배열은 아래와 같은 형태이다.

char Board[3][3];
Board[1][1] = 'I';
 
 
Board[0][0]
Board[0][1]
Board[0][2]
Board[1][0]
Board[1][1] = 'I'
Board[1][2]
Board[2][0]
Board[2][1]
Board[2][2]

위의 C스타일 배열과 거의 똑같지만 C++에서 제공하는 <array>헤더 파일을 인클루드해 사용가능한 고정 크기 배열이다. C스타일 배열과 비교했을 때 항상 크기를 정확히 알 수 있고, 자동으로 포인터를 캐스팅하지 않아서 특정한 종류의 버그를 방지한다. 또한 반복자로 배열에 원소에 대한 반복문을 쉽게 작성할 수 있다.

#include <iostream>
#include <array>

using namespace std;

int main()
{
    array<int, 3> arr = {9, 8, 7}; // array<타입, 크기> <이름>
    cout << "Array size " << arr.size() << endl;  
    cout << "1st element " << arr[1] << endl;
}
 

-std::vector

C++ 표준 라이브러리에서 제공하는 대표적인 가변 크기 컨테이너로 크기가 고정되지 않은 배열로 생각하면 된다.

<vector> 헤터 파일에 선언되어 있고 C스타일 배열보다 훨씬 유연하고 안전하다. 프로그래머가 메모리 관리를 신경 쓸 필요가 없고 동적이기 때문에 실행 시간에 원소를 추가하거나 삭제할 수 있다.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> myVector= { 1, 2, 3 }; // vector<타입> <이름>
    
    myvector.push_back(4); // 맨 뒤에 해당 원소를 추가한다.
    cout << "1st element " << myVector[0] << endl;
}
 

vector는 관련된 유용한 함수들을 많이 제공하는데 이를 통해 vector를 쉽게 다룰 수 있다.

assign(범위, 초기화 값)
벡터 처음부터 범위까지 초기화 값으로 변경
begin()
벡터의 시작점 주소 값 반환
end()
벡터의 끝부분 +1 주소 값 반환
at( 인덱스 )
벡터의 해당 인덱스에 접근(범위 검사)
front()
첫 번째 원소 접근
back()
마지막 원소 접근
push_back(원소)
벡터 마지막에 해당 원소 추가
pop_back()
벡터 마지막 원소 제거
insert(삽입 위치, 원소)
삽입 위치에 해당 원소 추가
erase(삭제 위치)
삭제 위치의 원소 제거
clear()
벡터의 모든 요소를 제거
size()
벡터의 크기 반환

 

이외에도 많은 함수가 존재하고 비슷한 함수가 존재할지라도 미세한 차이가 있으므로 자세히 알아보고 쓸 필요가 있다.

 

728x90