실무에서 많이 사용
어떤 자료형도 넣을 수 있는 동적 배열
그 안에 저장된 모든 요소들이 연속된 메모리 공간에 위치(Sequence Container)
요소 수가 증가함에 따라 자동으로 메모리를 관리해 줌
어떤 요소에도 임의로 접근(random access) 가능
"한마디로 메모리 관리 자동으로 해주는 배열"
Ex)
std::vector<int> scores;
scores.reserve(2);
scores.push_back(30);
scores.push_back(50);
scores.pop_back()
std::cout << "Current capacity" << scores.capacity() << std::endl;
std::cout << "Current size" << scores.size() << std::endl;
scores.push_back();//맨 뒤에 추가
scores.pop_back();//맨 뒤에 제거
capacity
size
[10][20][ ]
크기 : 2
용량 : 3
vector data(16);
for(int i = 0; i < 100; i++)
{
data.push_back(i);
}
//재할당을 16,32,64,128 capacity로 reserve하게 된다. 쓸데없이 리소스가 낭비된다.
//얼마만큼 데이터를 넣을지 알고 있다면 처음부터 그만큼 reserve 하자.
vector data;
data.reserve(100)
int data[100];
1) 생성자 방식
std::vector<int> scores(3);//실제 요소 3개 넣음
scores.push_back(30);
scores.push_back(50);
// capacity : 6
// size : 5;
2) reserve 방식
std::vector<int> scores;
scores.reserve(3);
scores.push_back(30);
scores.push_back(50);
// capacity : 3
// size : 2;
operator[](size_t n)
scores[i] = 3;
std::cout << names[i] << " ";
std::cout << myCats[i].GetScore() << " ";
scores.at(3)// 다음처럼 at 함수를 사용 할 수 도 있음.
scores.resize(10);
크기도 용량도 10으로 만듬
int main()
{
std::vector<int> scores;
scores.reserve(2);
scores.push_back(30);
scores.push_back(50);
for(size_t i = 0; i < scores.size(); ++i)
{
std::cout << scores[i] << std::endl;
}
}
EX) iterator 방식 순회
int main()
{
std::vector<int> scores;
scores.reserve(2);
scores.push_back(30);
scores.push_back(50);
for(std::vector<int>::iterator iter = scores.begin();
iter != scores.end(); ++iter)
{
std::cout << *iter << std::endl;
}
}
[10][10][20][30][40][5][ ]
A A
| |
begin() end()
마지막 NULL 가리킴
rend rbegin
| |
V V
[ ][10][20][30][40][50][ ]
A A
| |
begin() end()
std::vector<int> scores;
scores.reserve(4);
scores.push_back(10);// 10
scores.push_back(50);// 10, 50
scores.push_back(38);// 10, 50, 38
scores.push_back(100);// 10, 50, 38, 100
std::vector<int>::iterator it = scores.v.begin();
it++;
it = scores.insert(it, 80);// 10, 80, 50, 38, 100
std::vector<int> scores;
scores.reserve(4);
// 10, 50, 38, 100 넣음
std::vector<int>::iterator it;
it = scores.begin();
// -메모리-
// 0x1000 [10][50][38][100][다른 메모리, 사용 불가]
// 0x1014 [ ][ ][ ][ ][ ]
// it = scores.insert(it, 80);
// -메모리-
// 0x1000 [ ][ ][ ][ ][다른 메모리, 사용 불가]
// 0x1014 [80][10][50][38][100] <-- 메모리 재 할당해서 복사함
// - 복사 리소스 발생
// - 메모리 재할당이 일어났음
std::vector<int> scores;
scores.reserve(4);
scores.push_back(10);// 10
scores.push_back(50);// 10, 50
scores.push_back(38);// 10, 50, 38
scores.push_back(100);// 10, 50, 38, 100
std::vector<int>::iterator it;
it = scores.begin();
it = scores.erase(it);// 50, 38, 100
while(iter != scores.end())
{
if(iter->GetClassName() == "Java")
{
iter = scores.erase(iter); // "요소 순환중에 이렇게 삭제가 가능 하다."
// iter 대입하는 이유는 삭제 후 두에 요소들이 앞으로 한칸씩 당겨질텐데
// 지워진 위치를 가리키기 위해서...
// 사실 벡터는 위치의 변환이 없을 테지만 다른 컨테이너들은
// 위치의 변환이 있을 수 도 있으니 대입해서 가리킨다.
}
else
{
iter++;
}
}
vector<int> anotherScores;
anotherScores.assign(7,100);
// 100, 100, 100, 100, 100, 100, 100
vector<int> scores;
scores.reserve(2):
scores.push_back(85);
scores.push_back(73);// 85, 73
vector<int> anotherScores;
anotherScores.assign(7,100);// 100, 100, 100, 100, 100, 100, 100
// scores : 85, 73
// anotherScores : 100, 100, 100, 100, 100, 100, 100
scores.swap(anotherScores);
// scores : 100, 100, 100, 100, 100, 100, 100
// anotherScores : 85, 73
vector<int> scores;
scores.reserve(3):
scores.push_back(30);
scores.push_back(100);
scores.push_back(70);
scores.resize(2);
// 벡터의 크기를 2로 줄인다.
// 마지막 70이 날라감.
// vector의 크기를 바꾼다.
// 새 크기가 vector의 기존 크기보다 작으면, 초과분이 제거됨.
// 새 크기가 vector의 용량보다 크면 재할당이 일어남.
class Score
{
public:
//
private:
int mScore;
string mClassName;
};
:
int main()
{
vector<Score> scores;
scores.reserve(4);
scores.push_back(Score(30, "C++"));// Object를 넣을때 복사를 해서 들어감.
scores.push_back(Score(59, "Algorithm"));
scores.push_back(Score(87, "Java"));
scores.push_back(Score(41, "Android"));
}
vector<Score> scores;
scores.reserve(1);
scores.push_back(Score(10, "C++"));
/*
메모리 상황
[10]["C++"][할당 불가 영역]
[ ][ ][ ]
*/
scores.push_back(Score(41, "Android"));
/*
메모리 상황
[ ][ ][할당 불가 영역]
[10]["C++"][41]["Android"] <-- vector 전체를 옮겨야 하는 상황
메모리 재할당 리소스 발생
메모리 복사 리소스 발생
*/
vector<Score> scores2 = scores;
vector<Score> scores;
scores.reserve(2);
scores.push_back(new Score(30, "C++"));
scores.push_back(new Score(87, "Java"));
scores.push_back(new Score(41, "Android"));
scores.clear();
// 이렇게 하는 순간 메모리 릭.
// scores안에 있는 메모리들 delete 해주는 것 잊었다.