[C++] 알고리즘 문제풀 때 주로 쓰는 Vector 내장함수

개요 및 주요 특징

시퀀스 컨테이너 중에 하나이다.
배열을 대신하는 역할을 수행하는데, 배열에서 제공하지 않는 거의 대부분에 필요한 기능들을 제공해주고 있기 때문에 자주쓰는 기능을 익히고 외워둘 필요가 있다.

특히 링크드리스트가 필요한 문제들을 풀 때 자료 구조에 꼬리에서만 삽입/삭제가 일어 난다면, 굳이 구현할 필요없이 벡터 내장 함수로 대체가 가능하다.

여기선 내가 알고리즘 문제를 풀 때 벡터를 사용하게될 경우 자주 사용하게 되는 내장함수 및 방법만 기록해놓는다.

Vector 주요 특징

특징 1.

벡터의 크기는 동적으로 조절 가능.

특징 2.

이터레이터로 요소에 접근이 가능하다 .

특징 3.

물론 속도적인 측면에선 그냥 배열보단 떨어지지만, 배열에서도 크기가 안정해져서 동적할당하는데 걸리는 시간을 생각하면,, 크게 나쁘지 않을지도?




자주쓰는 내장함수

1. 삽입

vector<int> sample;
sample.push_back(1);

vector<string> sample1;
sample.push_back("abcd");

vector<char> sample3;
sample.push_back('a');

push_back 을 써서 벡터 맨뒤에 정보를 하나 입력하는 방식이다.
이게 문제 풀 때 좋은 점은,, 크기를 동적으로 늘리는 점 + 구조체도 넣을 수 있다는 점이다 !

그렇다면? 문제 중 어떤 좌표를 (x,y) 활용 하거나 값을 간직하고 있어야해서 Struct (구조체) 를 써야할 경우 , 간편하게 Vector에 집어 넣을 수 있다는 점이 매우 좋다

2. 사이즈

vector<int> sample;
sample.push_back(1);

for(int i=0;i<sample.size();i++)

사실 이건 너무 근본이다.
size를 주로 쓰는 용도는 해당 벡터의 크기만큼 반복문을 돌릴 때 거의 매 문제에 쓴다.

3. 삭제

vector<int> sample;

sample.push_back(1);
sample.push_back(2);
sample.push_back(3);

for (int i = 0; i < sample.size(); i++) {
	if (sample[i] == 2) { 
		sample.erase(sample.begin() + i);
		i--;
	}
}

문제 풀 때 진짜 많이 쓰는 형태이다, 이건 기억해둬야한다(까먹기가 너무 쉬워서,,)

이게 있어야 링크드리스트에서 삽입삭제가 가능한 역할같이 수행이 된다 ( 물론 효율적이진 않아서,, 속도는 문제가되지만,, 빠르게 문제풀 때는 확실히 좋다)

위 코드를 보면 3개를 넣고 2와 같으면 지우는 역할을 수행한다.
erase란 내장함수를 쓰는건데 해당 vector에 begin 과 해당 위치 +i 로 그 역할을 수행한다.

문제를 풀다보면 특정 내용과 매칭되면 제거해줘야하는 경우에 문제가 진짜 많다. 그니까 이거는 알아두면 매우 유용하다.

erase를 하고 i-- 가 진짜 잊으면 안된다.
하나 줄어든 벡터내에 숫자 3도 위치가 1로 바뀌기 때문이고, for문도 sample.size() 에 맞춰서 끝나야 하기 때문이다.



4. 2차원 벡터 초기화

종종 그림을 그려야하는 문제, 또는 미리 0으로 2차원 벡터를 초기화 해야되는 문제가 있다.

vector<vector<int>> test;
	vector<int> sample;
	sample.assign(5, 0);

	for (int i = 0; i < 5; i++)test.push_back(sample);

벡터.assign(사이즈를 몇으로 할지 , 거기에 채워질 값)

이러한 형태로 이해할 수 있다
이것으로 만든 1차원 벡터를 그대로 2차원 vector에 push_back 해준다 . 그러면 0으로 초기화된 2차원 벡터가 만들어진다!

이거 생각보다 문제풀 때 자주 쓴다

★이 글 쓰면서 느낀 점★

생각보다 알고리즘 문제 풀 때 제가 주로 쓰는 것들만 적은건데,,
진짜 많이 안쓰고 쓰는 것들만 쓰는구나,, 싶었습니다.
근데 그런데도 쓰는게 종종 헷갈려요. (저는 원래 주로 동적할당을 해서 썼지, 벡터는 나중에 배워서 쓰기 시작했거든요,,)

보시고 이상한 점이나 더 유용한게 있으면 댓글달아주면 또 참고하겠습니다. 위에것들 진짜 자주써요 ! 외워요!

좋은 웹페이지 즐겨찾기