standard template library
프로그래밍할 때 필요한 자료구조 알고리즘들을 템플릿으로 제공하는 라이브러리
컨테이너: 데이터를 저장하는 객체(자료구조)
여유분을 두고 메모리를 할당한다.
여유분이 꽉 차면 메모리를 증설한다.(컴파일러에 따라 다름. 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 계속 써줘야 된다.
포인터와 유사하다.
객체이다.
컨테이너의 원소를 가리킨다.
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;
}
}