vector란 c++의 STL(표준 템플릿 라이브러리)로 연속 컨테이너에 해당한다.
char, int, struct 등 모든 형식의 데이터를 삽입할 수 있다.
<vector>
헤더파일 추가
using namespace std;
< 생략 시 앞에 std:: 붙여줘야 한다.
vector 선언의 일반적인 형태는 vector <데이터 타입> 변수이름;
이다.
#include <stdio.h>
#include <vector>
using namespace std;
vector<int> v;
int main(void) {
for (int i = 0; i <= 10; i++) v.push_back(i);
vector <int>::iterator b = v.begin();
/*for (int i = 0; i < 50; i++)
v.push_back(i);*/ // 삽입이나 삭제 시 반복자가 무효화되어 오류 발생
for (int i = 0; i <= 10; i++)
{
printf("%d\n", (*b)); b++;
}
vector<int> vCopy(v); // v를 복사한 vCopy 벡터 생성
printf("v의 첫 번째 데이터 : %d\n", v[0]);
v.clear();
printf("v >> %d\n", v.empty()); // true : 1, false : 0
printf("%d", vCopy[2]);
}
vector <int> v;
비어있는 vector v 생성
vector <int> v(10);
0으로 초기화된길이 10의 vector v 생성
vector <int> v(10, -1);
-1로 초기화된 길이 10의 vector v 생성
vector <int> vCopy(v);
v를 복사한 vCopy vector 생성
v[idx];
v의 idx번째 위치의 데이터 참조. 배열과 비슷한 사용.
v.at(idx);
v의 idx번째 위치의 데이터 참조. v[idx]; 보다 느린 방법이지만, 범위 초과를 방지하는 점검을 거침.
v.front();
v의 첫 번째 데이터를 참조.
v.back();
v의 마지막 데이터를 참조.
v.begin();
첫 번째 데이터를 가리킴. 포인터와 비슷한 iterator.
v.end();
마지막 데이터의 다음을 가리킴. 포인터와 비슷한 iterator.
v.rbegin();
거꾸로 begin 위치의 데이터를 가리킴. 즉 마지막 원소를 가리킴. iterator.
v.rend();
거꾸로 end 위치를 가리킴. 즉 첫 번째 원소의 이전 위치를 가리킴. iterator.
v.push_back(5);
마지막 데이터 뒤에 데이터 5를 삽입.
v.pop_back();
마지막 원소 제거.
v.clear();
모든 원소 제거.
v.reserve(n);
n개의 데이터를 저장할 수 있는 공간을 동적할당으로 예약.
v.resize(n);
v의 크기를 n으로 변경. 원래 크기보다 작아지는 경우엔 뒤에서부터 지워짐. 원래 크기보다 커지는 경우엔 빈자리 0으로 초기화.
v.resize(n, 5);
v의 크기를 n으로 변경. 원래 크기보다 작아지는 경우엔 뒤에서부터 지워짐. 원래 크기보다 커지는 경우엔 빈자리 5로 초기화.
v.size();
데이터 갯수 리턴.
v.capacity();
할당된 공간 크기 리턴.
v2.swap(v1);
v1과 v2의 모든 것을 교환.
v.insert(5, 2);
5번째 위치에 2를 삽입.
v.insert(5, 2, 3);
5번째 위치를 시작으로 2를 3개 삽입. 가운데 끼워넣는 것이므로 전체 size 증가.
v.erase(iter);
iterator iter가 가리키는 데이터 삭제. 데이터가 삭제되었으므로 size 감소.
v.erase(iter1, iter2);
iter1부터 iter2이전까지 데이터 삭제.
v.empty();
v가 비어있으면 true, 비어있지 않으면 false 리턴. 즉 size가 0이면 true.
iterator는 배열의 요소를 가리키는 포인터이다.
test.insert(iter, 50);
iter(v 벡터의 첫 번째)에 50 삽입. 원래 있던 값은 하나씩 뒤로 밀림. 즉, 메모리 복사 및 재할당이 일어남
❓ 반복자가 곧 포인터인데 vector<int>::iterator iter;
대신 int *p;
를 사용하지 않는 이유
iterator : p++ > 다음 원소의 위치를 가리킴
일반포인터 : p++ > 다음 위치(int의 크기만큼 뒤에 있는 메모리)를 가리킴
배열 요소의 메모리 주소가 순서대로 저장되어 있지 않을 경우 포인터를 사용하면 다음 요소를 제대로 찾지 못 하게 되는데 반복자는 주소와 상관없이 다음 요소의 위치를 가리키기 때문에 사용에 적합하다.
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
v.reserve(3);
v.push_back(10);
v.push_back(20);
v.push_back(30);
vector<int>::iterator iter = v.begin();
test.insert(iter, 50);
for (iter = v.begin(); iter != v.end(); iter++)
{
cout << *iter << endl;
//printf("%d\n", *iter);
}
return 0;
}
참고
https://dense.tistory.com/entry/cpp-stl-vector
https://leemoney93.tistory.com/66