가변 배열
https://ddecode.tistory.com/entry/C%EA%B8%B0%EB%B3%B8-27%EA%B0%80%EB%B3%80-%EB%B0%B0%EC%97%B4
위 포스팅에 기존 배열의 문제점을 설명하고, 가변 배열의 구현을 해보았다.
굳이 우리가 직접 만들지 않아도 이는 Vector라는 이름으로 STL에 구현되어있다.
vector는?
벡터는, 힙 메모리 공간에 생성되는 동적 할당되는 배열이다.
기존 배열보다 효율적으로 메모리를 관리하는 것이 가능하다!
삭제의 경우에도 지원하지만, 맨 끝을 삭제하는 것이 아닌 이상,
삭제할때마다 삭제하는 원소 기준 뒷부분이 앞으로 이동하기에, 삭제가
자주 일어나는 상황에서는 속도가 느려질 수 있다.(연결 리스트를 사용하면 좋다!)
vector의 헤더파일
#include <vector>
이 헤더를 통해 vector를 사용할 수 있다.
vector의 선언, 초기화
vector<int> myvector;
-비어있는 vector myvector를 생성한다!
vector<int> myvector(5);
-크기가 5인 myvector를 생성한다!
vector<int> myvector(10,6);
-크기가 10이며, 6으로 초기화 된 myvector를 생성한다
vector<int> myvector = {5,6,7};
-크기 3의 5,6,7이 들어가있는 myvector를 생성한다.
vector<int> myvector(yourvector);
-yourvector를 복사한 myvector를 생성한다.
vector<vector<int>> myvector;
-2차원 배열의 형태인 myvector를 생성한다.
vector의 반복자
myvector.begin()
-myvector의 시작, 첫번쨰 주소를 반환한다.
myvector.end()
-myvector의 마지막 원소의 다음 주소를 반환한다!
-begin()과 달리, 끝주소 +1의 값의 형태이다! 이점 주의
vector<int> myvector = {1,2,3,4,5,6,7,8,9,10};
for (auto i = myvector.begin(); i != myvector.end(); i++)
cout << *i << endl;
즉, 이런 코드를 통해 전체 원소를 출력할 수 있다!
vector의 삽입, 삭제는?
push_back()
myvector.push_back(10);
-myvector의 마지막 부분에 10을 삽입한다!
pop_back()
myvector.pop_back();
-myvector의 마지막 원소를 삭제한다.
이 경우, 데이터 마지막 원소를 삭제한 것이므로 삭제후 특별한 데이터 연산이 이루어지지 않는다.
insert()
myvector.insert(myvector.begin()+1, 6);
-벡터의 중간에 값을 입력하고 싶을 때 사용하는 방법이다.
-첫번쨰 인자로 넣을 위치, 두번쨰 인자로 넣을 데이터를 입력한다.
-데이터의 양이 많을 경우, 많은 데이터 이동이 발생하기 떄문에, 적합한 방법은 아니다.
myvector.insert(myvector.begin()+1, 6,5);
//myvector.begin()+1의 위치에, 5를 6번 넣는다.
3개의 인자를 받는 경우에는, 세번쨰 인자의 데이터를 , 두번째 인자만큼 넣는다.
erase()
myvector.erase(myvector.begin() + 2);
//myvector.begin() + 2 위치에 있는 데이터를 삭제한다.
myvector.erase(myvector.begin(),myvector.begin()+5);
//myvector.begin() 부터 myvector.begin()+5 까지의 데이터를 삭제한다.
-벡터의 중간을 삭제하고 싶을 때 사용한다.
-인자가 하나면 그위치의 데이터를, 두개면 그 사이의 모든 데이터를 삭제한다.
-insert와 마찬가지로, 많은 데이터 이동이 발생하기 떄문에, 비효율적일 수 있다.
clear()
myvector.clear()
-벡터 안의 모든 값을 삭제한다.
기타 함수
size()
myvector.size()
-벡터의 크기(원소 개수)를 반환합니다.
empty()
myvector.empty()
-벡터가 비어있는지 검사합니다.
-비어있다면 1, 아니면 0를 반환합니다.
front()
myvector.front()
-벡터의 맨 앞 원소를 반환합니다.
back()
myvector.back();
-벡터의 맨 뒤 원소를 반환합니다.
벡터의 각 요소 접근 하기
반복자와 역참조를 통해 접근하기
for (auto i = myvector.begin(); i != myvector.end(); ++i){
cout << *i << endl;
}
반복자는 myvector.begin()부터 시작하여, myvector.end()를 만날 떄까지 반복하고,
이를 역참조해가면서 출력한다.
배열처럼 접근하기
for (int i = 0; i < myvector.size();i++) {
cout << myvector[i] << endl;
}
크기를 반환해주는 size() 함수를 통해, 배열 원소를 접근하듯이 돌고 출력한다.
at()함수를 통해 접근하기
for (int i = 0; i < myvector.size();i++) {
cout << myvector.at(i) << endl;
}
at()함수는 해당 인덱스의 있는 닶을 반환해 주는 함수이다.
배열과 마찬가지인 형태라고 볼 수 있다.
'프로그래밍 언어 > C++ [STL]' 카테고리의 다른 글
[C++STL] STL(Standard Template Library) 이란 무엇인가? (0) | 2021.08.25 |
---|