cout
cout은 객체다. 아래는 cout의 형식으로 OSTREAM클래스와 그 객체 COUT을 만들어본 것이다.
namespace MyStd
{
class OSTREAM
{
public:
OSTREAM& operator <<(int iData)
{
printf("%d", iData);
return *this;
}
OSTREAM& operator <<(char* pData)
{
printf("%s", pData);
return *this;
}
};
OSTREAM COUT;
char* ENDL = "\n";
}
<< 연산자를 오버로딩해서 정수일 경우 %d 서식으로 printf 문자열일 경우 %s 서식으로 printf한다.
레퍼런스로 반환해서 cout << 3 << "ASDF"; 처럼 연속해서 출력할 수 있게 한다.
벡터
배열 기반 컨테이너로 push_back을 할 때마다 capcity가 부족할 경우 메모리 재할당이 일어난다.
그래서 웬만하면 reserve로 어느 정도 크기를 미리 할당해 주는 것이 좋다.
할당한 공간을 없애려면 어떻게 해야 할까? scope를 벗어나면 할당한 공간이 없어지겠지만 그 전에 지우고 싶다면?
vector<int>().swap(vec); // vec이 비워지고 할당된 공간도 제거됨
vector<int>(vec).swap(vec); // vec의 capcity가 size와 같아짐
vec.shrink_to_fit(); // 두번째 코드와 동일
첫번째 코드는 swap이라는 벡터와 다른 벡터의 내용물을 교체하는 코드인데. vector<int>()는 int를 담는 벡터의 임시 객체이다. 이 임시객체는 비어있고 size와 capacity가 0이므로 기존의 vec과 교체하면 vec은 size,capacity가 0이되고 할당된 공간이 지워진다. 두번째 코드는 임시객체에 기존 벡터 vec을 복사해서 swap하는데 vec을 복사한 임시객체는 capacity가 size와 같게 설정되므로 vec의 capacity가 size와 같아진다. 세번째 코드도 두번째 코드와 같은 기능을 가지는데, 검색해보니까 성능적으로 말이 많아서 차라리 두번째 코드처럼 swap을 사용하는 것이 권장된다고 한다.
'Today I Learned' 카테고리의 다른 글
| 23.02.28 - map (0) | 2023.02.28 |
|---|---|
| 23.02.24 - 반복자, 알고리즘 (0) | 2023.02.24 |
| 23.02.22 - 템플릿2, STL개론 (0) | 2023.02.22 |
| 23.02.21 - 함수 객체, 임시 객체, 템플릿 (0) | 2023.02.21 |
| 23.02.20 - 캐스팅 연산자, 인라인 함수, 연산자 오버로딩 (0) | 2023.02.20 |