#include<iostream>
#include<vector>intmain(){std::vector<int>scores;// <- 템플릿! <int>. 이게 c#의 <T>.. 제네릭과 비슷한 것scores.reserve(2);// 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;}
1-1. reserve
vector의 용량을 늘린다
용량이 증가해야 하면, 새로운 저장 공간을 재할당하고 기존 요소들을 모두 새 공간으로 복사
느릴 수 밖에 없지만 이걸 사용하는 게 낫다 왜냐면!
불필요한 재할당을 막기 위해! vector를 생성한 직후에 이 함수를 호출하자
scores.reserve(10);
1-2. 요소 하나에 접근하기
operator[](size_t n)
지정된 위치(n)의 요소를 참조로 반환한다
1
2
3
scores[i]=3;// 그냥 값으로 반환한다면 대입이 안되었겠죠// 값은 임시적으로 반환된 값이니까, 대입해봐야 원본은 바뀌지 않을것// 하지만 바뀌죠? 그러니 참조로 반환되었다는 걸 알 수 있다!
// Score.hclassScore{public:// ...private:intmScore;stringmClassName;};// Main.cppintmain(){vector<Score>scores;// 클래스로 구성된 벡터. 오브젝트를 넣을 거임.scores.reserve(4);scores.push_back(Score(30,"C++"));// Score 개체를 스택에 임시로 만들었다가// push_back할 때 벡터에 복사되어 들어가진다.scores.push_back(Score(59,"Algorithm"));scores.push_back(Score(87,"Java"));scores.push_back(Score(41,"Android"));}
1-5. 포인터 벡터
객체를 직접 보관하는 벡터의 문제점
1
2
3
4
5
6
7
8
9
10
vector<Score>scores;scores.reserve(1);// 공간 1 예약scores.push_back(Score(10,"C++"));scores.push_back(Score(41,"Android"));// 메모리 재할당 발생// 그런데 객체를 보관하는 vector 이므로// 오브젝트들을 다 복사해야 하는 상황이 발생...// capacity, size, 주소까지 합쳐서 12바이트 정도 복사가 되는 거임.vector<Score>scores2=scores;// 대입을 하여 사본이 생기는 것이니 또 복사가 일어나게 됨.
메모리 복사 양이 많아진다.
💡 그래서 포인터를 저장하는 것으로 해결하자!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
intmain(){vector<Score*>scores;//Score의 포인터를 저장하겠다는 변수scores.reserve(2);scores.push_back(newScore(30,"C++"));// 객체를 힙에 만들어서 저장하고, 벡터는 스택에 만들어져 주소 저장scores.push_back(newScore(87,"Java"));// 재할당 발생. 벡터 변수 4바이트를 8바이트로 늘리는 재할당일 뿐scores.push_back(newScore(41,"Android"));for(vector<Score*>::iteratoriter=scores.begin();iter!=scores.end();++iter){delete*iter;// delete 해주기!}scores.clear();// 객체를 생성했을 경우 clear 전에 delete 해주는 것 까지 필요함!return0;}
댓글남기기