vector, iterator

Oak_Cassia·2021년 11월 30일
0

STL

standard template library
프로그래밍할 때 필요한 자료구조 알고리즘들을 템플릿으로 제공하는 라이브러리

컨테이너: 데이터를 저장하는 객체(자료구조)

vector 동적 배열

여유분을 두고 메모리를 할당한다.
여유분이 꽉 차면 메모리를 증설한다.(컴파일러에 따라 다름. 50%) 기존 영역을 버리고 새 영역에 할당
size: 유효한 element들의 수
v2.size()
capacity: 메모리가 할당되어 있는 공간의 용량
v3.size()

vector 끝에 1 추가
v.push_back(1);
마지막 원소 삭제
v.pop_back();
배열과 같이[]연산자를 사용하면 자료 반환
v[1]
위와 같은 기능
at(1)

capacity를 1000으로 할당
v4.reserve(1000);

1000개 element를 만들어 준다.
v5.resize(10);// 값은 0

capacity는 그대로 size는 0 (배열의 각 요소 삭제)
v5.clear();

capacity도 0으로 만들고 싶다면?

	vector<int> temp;
	v5.swap(temp);
	cout << "size: " << v5.size() << " capacity: " << v5.capacity() << endl;

using namespace std; 안해주면 vector 앞에 std 계속 써줘야 된다.

반복자 iterator

포인터와 유사하다.
객체이다.
컨테이너의 원소를 가리킨다.

vector<int>::iterator it;
it = v.begin();
it = v.end();

int* ptr = v.begin()._Ptr;
int* etr = v.end()._Ptr;

cout << *(++it) << " " << ++*(ptr) << endl;

const *int 와 유사한 경우.
vector<int>::const_iterator cit1 = v.cbegin();

v.insert()를 통해 3번째 자리에 5 삽입. 그리고 해당 위치 반환
vector<int>::iterator insertit = v.insert(v.begin() + 2, 5);

3번째 자리 원소 삭제 후 해당 위치 반환
vector<int>::iterator eraseit1 = v.erase(v.begin() + 2);

3번째 4번째 삭제 5번째 자리는 삭제하지 않는다. 3번째 자리 위치 반환
vector<int>::iterator eraseit2 = v.erase(v.begin() + 2, v.begin() + 4);//2,3 까지 삭제, 반환 값은 삭제한 위치 가리킨다.

erase()로 iterator를 삭제하면 해당 반복자(변수)는 못쓴다.
(주소 값은 남아있지만 Myproxi가 NULL값이 됨)
다시 쓰고 싶으면 이렇게 반환값을 이용
it = v.erase(it);

random access iteraotor: 벡터와 배열 등 연속된 자료구조에 사용한다.
forward iterator: forward_list 같이 증가연산만 가능한 반복자에서 사용


#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v;
	vector<int> v2(1000, 0);
	vector<int> v3 = v2;
	cout << "size: " << v2.size() << " capacity: " << v2.capacity() << " v2[0]: " << v2[0] << endl;
	cout << "size: " << v3.size() << " capacity: " << v3.capacity() << " v3[0]: " << v3[0] << endl;
	int i;

	for (i = 1; i < 10; i++)
	{
		v.push_back(1);
		cout << "size: " << v.size() << " capacity: " << v.capacity() << endl;

	}


	int size = v.size();

	for (i = 1; i < size; i++)
	{
		cout << v[i] << endl;;
	}

	vector<int> v4;
	v4.reserve(1000);
	cout << "size: " << v4.size() << " capacity: " << v4.capacity() << endl;

	vector<int> v5;
	v5.resize(1000);
	cout << "size: " << v5.size() << " capacity: " << v5.capacity() << endl;

	v5.clear();
	cout << "size: " << v5.size() << " capacity: " << v5.capacity() << endl;

	vector<int> temp;
	v5.swap(temp);
	cout << "size: " << v5.size() << " capacity: " << v5.capacity() << endl;



	vector<int>::iterator it;
	it = v.begin();
	int* ptr = v.begin()._Ptr;
	int* etr = v.end()._Ptr;
	cout << *(++it) << " " << ++*(ptr) << endl;

	vector<int>::const_iterator cit1 = v.cbegin(); //const *int 와 비슷하다.
	

	
	for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit)
	{
		cout << *rit << endl;
	}
	
	vector<int>::reverse_iterator rit1 = v.rbegin();
	vector<int>::reverse_iterator rit2 = v.rend();
	cout << *rit1 <<   endl;
	cout <<  *(rit2-1) << endl;

	cout << "----------" << endl;

	v.pop_back();
	vector<int>::iterator insertit = v.insert(v.begin() + 2, 5);
	cout << *insertit << endl;
	v.erase(v.begin() + 2);
	vector<int>::iterator eraseit1 = v.erase(v.begin() + 2);// 마지막값은 삭제하지않고 느낌이 end()만 한칸 앞을 가리키게한다. 삭제한 위치 가리킨다.
	
	for (i = 1; i < v.size(); i++)
	{
		cout << i<<"  " << v[i] << endl;;
	}
	vector<int>::iterator eraseit2 = v.erase(v.begin() + 2, v.begin() + 4);//2,3 까지 삭제, 반환 값은 삭제한 위치 가리킨다. 
	for (i = 1; i < v.size(); i++)
	{
		cout << i << "  " << v[i] << endl;
	}


	for (vector<int>::iterator it = v.begin(); it != v.end();)
	{
		int data = *it;
			if (data == 1)
			{
				it = v.erase(it);
			}
			else ++it;
	}
	for (i = 1; i < v.size(); i++)
	{
		cout << "---" << endl;
		cout << i << "  " << v[i] << endl;
	}
}
profile
rust로 뭐할까

0개의 댓글