C++ Rookiss Part1 C++ 프로그래밍 입문 : Vector2
🙇♀️Vector2
🪐Vector2
#include <iostream>
using namespace std;
#include <vector>
// 주제 : vector
int main()
{
// 컨테이너(Container) : 데이터를 저장하는 객체 (자료구조 Data Structure)
// vector (동적 배열)
// - vector의 동작 원리 (size/capacity)
// - 중간 삽입/삭제
// - 처음/끝 삽입/삭제
// - 임의 접근
// 반복자(Iterator) : 포인터와 유사한 개념. 컨테이너의 원소(데이터)를 가리키고, 다음/이전 원소로 이동 가능
vector<int> v(10);
for (vector<int>::size_type i = 0; i < v.size(); i++)
v[i] = i;
vector<int>::iterator it;
int* ptr;
it = v.begin();
ptr = &v[0];
cout << (*it) << endl;
cout << (*ptr) << endl;
vector<int>::iterator itBegin = v.begin();
vector<int>::iterator itEnd = v.end();
// 더 복잡해보이는데?
// 다른 컨테이너는 v[i]와 같은 인덱스 접근이 안 될 수도 있음
// iterator는 vector뿐 아니라, 다른 컨테이너에도 공통적으로 있는 개념
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << (*it) << endl;
}
int* ptrBegin = &v[0]; // v.begin()._Ptr;
int* ptrEnd = ptrBegin + 10; // v.end()._Ptr;
for (int* ptr = ptrBegin; ptr != ptrEnd; ++ptr)
{
cout << (*ptr) << endl;
}
// const int*;
// vector<int>::const_iterator cit1 = v.cbegin();
// *cit1 = 100;
for (vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it)
{
cout << (*it) << endl;
}
// - 중간 삽입/삭제 (BAD)
// - 처음/끝 삽입/삭제 (BAD / GOOD)
// - 임의 접근 (Random Access)
// vector = 동적 배열 = 동적으로 커지는 배열 = 배열
// 원소가 하나의 메모리 블록에 연속하게 저장된다!!
//v.push_back(1);
//v.pop_back();
//vector<int>::iterator insertIt = v.insert(v.begin() + 2, 5);
//vector<int>::iterator eraseIt1 = v.erase(v.begin() + 2);
//vector<int>::iterator eraseIt2 = v.erase(v.begin() + 2, v.begin() + 4);
// 쭉~ 스캔하면서, 3이라는 데이터가 있으면 일괄적으로 삭제하고 싶다
for (vector<int>::iterator it = v.begin(); it != v.end();)
{
int data = *it;
if (data == 3)
{
it = v.erase(it);
}
else
{
++it;
}
}
return 0;
}
vector는 동적배열이고 공간이 부족하면 capacity를 1.5배 해주고 새롭게 다시 만든다. 처음 삽입/삭제는 안좋지만 끝 삽입/삭제는 좋다. 중간 삽입/삭제는 안좋다. size는 내가 진짜 할당하고 있는 크기. capacity는 수용 할 수 있는 공간!
vector, list, deque는 시퀀스 컨테이너라고 부른다.