본문 바로가기
프로그래밍 관련/C++

C++ vector

by 존버매니아.임베디드 개발자 2020. 4. 26.
반응형

학교 다닐 때 C++을 아주아주 간략하게 배웠고, 그때 당시에 유명했던 열혈강의라는 책으로 C++을 공부했었다.

근데 그때 당시에는 STL 이런게 없었던거 같은데

알고리즘 공부를 하다보니 요즘에는 STL이라는게 아주 대중적으로 쓰이는것을 알게됐다.

 

1. vector 데이터타입(?)

파이썬에도 이것과 비슷한 데이터타입이 있는걸로 아는데, 

기존에 C나 C++에서 사용하던 배열 같은건데 좀 더 편리하고, 링크드리스트 스러운 것들이 좀 추가되었음.

 

#include <vector> 를 포함해야하며,

 

vector<int> abc; 

vector<char> abcd; 

변수 선언을 이런식으로 한다.

 

배열로 따지자면 int arr[8]; 

                      char abcd[3]; 이런 느낌이다.

그런데 배열은 처음 선언할 때 그 사이즈를 이미 고정시켜서 선언하며 또한 runtime에 그 크기가 변경될수 없는데

vector 타입의 경우 처음 선언 할 떄 사이즈를 정할수도, 안정할 수도 있다.

 

0.선언 방법

vector<int> abc;     // 내용물을 갖지 않음

vector<int> abc(3); // 내용물이 3개이며 그 값은 모두 0으로 초기화

vector<int> abc(5,3); // 내용물이 5개이며 그 값은 모두 3으로 초기화

 
혹은 배열처럼
vector<int> abc = {1,2,3,4 5}; 이런식도 가능

 

1. push_back()

vector<int> abc;

abc.push_back(15);

abc.push_back(250);

 

위와 같은 코드를 실행하고나면, abc는 2개의 데이터를 갖는 배열과 비슷한 의미를 갖게된다.

 

abc[0] 에 15라는 값이 담겨있고 ,   abc[1] 에 250이라는 값이 담겨있다.

abc[0], abc[1] 이런식으로 배열처럼 접근, 데이터 수정도 가능하다.

 

1-2). push_front() 도 있는데 이거는 제일 앞에 데이터 추가하는게 다름

 

2. pop_back(); 이렇게하면 제일 마지막에 추가되어있는 데이터가 벡터에서 삭제된다.

abc.pop_bac(); 을 수행하고나면 앞에 벡터 abc에서 abc[1]이 삭제가 된다.

 

3. size();

abc.size(); 를 호출하면 abc가 갖고 있는 데이터의 갯수를 리턴해준다.

배열의 사이즈를 return 해주는것과 비슷하다고 볼 수 있다.

 

4.clear()

abc.clear(); 를 호출하면 벡터가 포함하고 있던 데이터들을 모두 삭제하고 비어 있는 상태가 된다.

 

5.insert

링크드리스트처럼, 벡터의 중간 index에 추가로 데이터 삽입이 가능한 명령이다.

 ex) 100, 250, 300 , 400 이런식으로 데이터가 들어가 있는데 제일 마지막에 원소를 추가 하는게 아니라

100 다음에 200을 넣어서 100,200,250,300,400 으로 만들 고 싶은 경우 사용가능.

 

insert(1,200); (1번 인덱스 자리에 값 200을 넣는다는 의미)

 

insert(1,3,200); (1번 인덱스 자리에서부터 숫자 200을 3번 넣음)

 

6. front(), back();

제일 첫번째 인데스에 들어가 있는 데이터 리턴, 제일 마지막 인덱스에 들어가 있는 데이터 리턴

 

7. empty();

비어있는 벡터이면 true 리턴

 

 

8. 벡터를 함수의 파라미터로 제공 할 때(call by value, call by ref)

 

void test_val_fun(vector<int> input)

{

input[2]=500; // 이렇게 값 바꿔도 test에 선언된 원본 벡터인 abcd의 내용 변경 x

}

void test_ref_fun(vector<int> &input)

{

input[2]=500; // 파라미터 이름에 &만 붙이고 소스코드 내부에서는 똑같이 사용하면됨.

                 //이 경우 test에 선언된 원본 벡터인 abcd의 내용이 변경된다.

}

void test()

{

 vector<int> abcd(3,100);

 test_val_fun(abcd);

 test_ref_fun(abcd);

}

 

=> 위와 같은 예시에서 input에 들어오는건 값이 복사됨(원본 수정x) . Call by value 개념.

 

9. 2차원 벡터

vector<vector<int>> abc2;

이런식으로 2차원 벡터도 선언이 가능함

 

vector<vector> abcd;

vector<int> input1(5,3);
    
    abcd.push_back({0,5});     //[0, 5]
    abcd.push_back({1,2,3});  // [1,2,3]
    abcd.push_back(input1); // [ 3,3,3,3,3] 

위와 같은 형태의 2차원벡터가 된다. (배열처럼 열의 갯수가 통일될 필요 없음)

 

10. 벡터끼리의 대입

벡터간에 서로 대입 연산이 가능한데 무슨 말이냐면

vector<int> test1(3,3) ; //[3, 3, 3]

vector<int> test2(3,5); //[5, 5, 5]

 

test2=test1;

이런식으로 대입연산하면 call by value 형태로 복사

test2에는 test1과 똑같은 형태가 된다

참고로 call by value 형태로 copy되는 것이므로,

test1의 내용이 추후에 바뀌어도 test2에 영향을 안미친다.

 

 

 

반응형

'프로그래밍 관련 > C++' 카테고리의 다른 글

C++ map  (0) 2020.05.02
C++ stack  (0) 2020.05.01
c++ sort  (0) 2020.04.29
C++ string  (0) 2020.04.26
C++ Queue 사용  (0) 2020.04.26