vector 선언, 멤버 함수, iterator(반복자)

당근한박스·2024년 1월 17일
0

C++

목록 보기
17/23

vector ?

vector란 c++의 STL(표준 템플릿 라이브러리)로 연속 컨테이너에 해당한다.
char, int, struct 등 모든 형식의 데이터를 삽입할 수 있다.

vector 선언

<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 생성


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 (반복자)

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

0개의 댓글