학교 다닐 때 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 |