-> 메모리 자동 관리 배열이다.
#include <vector>
int main()
{
// 선언
std::vector<int> vector1;
std::vector<string> vector2;
std::vector<Cat> vector3;
std::vector<Cat *> vector5;
// 복사
std::vector<int> scores;
scores.push_back(1);
std::vector<int> scoresClone(scores); // 복사 생성자
// 생성시 크기 지정 (잘안씀)
std::vector<int> scroes(10);
// 10개를 넣을 수 있는 메모리를 미리 할당 후 초기화까지 함.
// 함수
vector[3];
// 요소 하나 접근
// 값이 바뀐다는 것은, 연산자가 참조를 반환하는 것을 알 수 있다.
vector.push_back(123); // 데이터 뒤에 삽입
vector.pop_back(); // 맨뒤 제거
vector.capacity(); // 할당된 메모리 (최대 담을 수 있는 요소의 수)
vector.size(); // 지금 담겨 있는 요소 수
vector.reserve(10);
// vector의 용량을 미리 정한다.
// 불필요한 재할등을 막기위해, 예상이 되는 곳은 미리 공간을 잡아두는 것이 좋다.
vector.resize(10);
// 크기를 바꾸고 초기화까지 해준다. int일 경우 0으로 채워준다.
// 용량이 더 크다면, 강제로 줄인다. 무조건 주어진 크기로 바꾼다.
iterator = vector.insert(iterator, 30);
// iterator 위치에 값을 넣고 나머지는 한칸씩 뒤로 미룬다.
// 삽입된 위치 iterator를 반환한다.
// 복사 문제 : 한칸씩 미루느라 성능 느림 수 있음.
// 매모리 재할당 : reserve를 미리 안하면, 연속된 공간을 찾느라 전체 메모리를 다시 찾을 수 있다.
vector.erase(iterator);
// iterator 위치의 요소를 삭제한다.
// 지우고 빈공간만큼 뒤 요소를 하나씩 땡겨야 한다.
vector.assign(7, 100); // 7개를 100으로 채운다. 위치는 어디서부터 ??
vector.swap(vector2);
// 2개 Vector 교환
// 메모리 할당 없어 빠르다.
vector.clear(); // 모든 요소 제거, 크기(size)는 0, 용량(capacity)는 변하진 않음.
// 반복 1
// 이 반복은 배열처럼 사용가능한 vector만 가능. 다른 STL Container는 Iterator 사용.
for (size_t i =0; i < scores.size(); ++i)
{
std::cout << scores[i] << " ";
}
// 반복 2
for (std::vector<int>::iterator iter = scores.begin(); iter != scores.end(); ++iter)
{
std::cout << *iter << " ";
}
// scroes.begin() : 첫번째 요소를 가리킨다.
// scroes.end() : 마지막 요소 '다음'을 가리킨다.
// 반복 3 (역순)
for (std::vector<int>::reverse_iterator iter = scores.rbegin(); iter != scores.rend(); ++iter)
{
std::cout << *iter << " ";
}
// 포인터 백터
std::vector<Score*> scores;
scores.reserve(2);
scores.push_back(new Score(10, "C");
// 생성한 요소 개체들은 delete를 꼭 해주자.
}
순서 상관없이 요소에 임의 접근 가능하다.
제일 마지막 요소 삽입/삭제가 빠르다.
중간 요소 삽입/삭제 느리다.
재할당 및 요소 복사에 비용이 든다.