Vector 값
#include <stdio.h>
#include <iostream>
#include <vector>
class Scores
{
public:
Scores(int score, std::string subject);
int score;
std::string subject;
};
Scores::Scores(int score, std::string subject)
{
this->score = score;
this->subject = subject;
}
int main()
{
std::vector<Scores> scores;
scores.reserve(3);
scores.push_back(Scores(30, "C++"));
scores.push_back(Scores(40, "JAVA"));
scores.push_back(Scores(50, "Python"));
std::vector<Scores>::iterator it = scores.begin();
for (std::vector<Scores>::iterator iter = scores.begin(); iter != scores.end(); ++iter)
{
std::cout << iter->score << (*iter).subject << std::endl;
}
}
위의 코드는 Vector에 Scores 객체를 담는 코드다. 이때 new Scores가 아니라 그냥 Scores로 객체를 만들기 때문에 값 복사가 일어난다(포인터가 아님). Scores 처럼 용량이 작은 객체는 괜찮지만 용량이 큰 객체를 이런식으로 관리하면 값 복사 문제때문에 굉장히 힘들어진다.
위의 그림은 scores 객체의 capacity를 초과해서 메모리 재할당이 일어나는 경우를 나타낸 그림이다.
이렇듯 객체를 직접 보관하면 값복사 때문에 굉장히 느려질 수 있다. 이때의 해결책은 JAVA처럼 포인터를 Vector에 저장하는 방법이다.
위의 그림은 scores의 사본을 만들때 발생하는 값 복사 문제다. 값으로 저장되어 있기 때문에 사본을 그대로 복사한다. 문제다 문제
Vector 포인터(JAVA 방식)
std::vector<Scores*> scores;
scores.reserve(3);
scores.push_back(new Scores(30, "C++"));
scores.push_back(new Scores(40, "JAVA"));
scores.push_back(new Scores(50, "Python"));
std::vector<Scores*>::iterator it = scores.begin();
for (std::vector<Scores*>::iterator iter = scores.begin(); iter != scores.end(); ++iter)
{
std::cout << (*iter)->score << (*iter)->subject << std::endl;
}
위의 코드는 new를 사용해서 포인터를 저장하는 Vector다. 해서 타입도 std::vector<Scores*>이다
여기서 주의해야할 점은 it는 Vector의 첫번째 인덱스의 값 즉 Socre 포인터(Score *)를 가르키는 포인터다. 그래서 값에 접근하기 위해서는 (*iter)->socre와 같이 사용해야한다.
위의 그림과 같이 메모리 복사가 일어나도 포인터 바이트(통상적으로 4바이트) 수만 복사하면 되니깐 아주 가볍다.
하지만 여기서 중요한점은 포인터기 때문에 메모리 제거를 내가 스스로 해줘야한다. clear()라고 해도 알아서 메모리 해제 해주지 않는다.
'C++' 카테고리의 다른 글
추상클래스(Abstract), 인터페이스 (0) | 2020.04.27 |
---|---|
C++ 템플릿 (0) | 2020.04.21 |
C++ iterator 개념 (0) | 2020.04.17 |
C++ 정적 바인딩, 동적 바인딩 (1) | 2020.04.09 |
C++ 멤버함수의 메모리 위치 (0) | 2020.04.09 |