728x90
STL (Standard Template Library)
- c++ 에서 제공하는 표준 템플릿 라이브러리
- std namespace안에 존재합니다.
- 템플릿을 이용하기 때문에 원하는 타입을 지정하고 데이터를 저장할 수 있습니다.
시퀀스 컨테이너 : vector, list, stack, queue
- vector
- 동적 배열을 구현해 놓은 클래스
- 필요에 따라 크기를 늘리거나 줄일 수 있습니다
- random access를 지원하여 인덱스로 접근이 가능합니다
- 끝에 추가할 경우 0(1)의 성능을 보여줍니다.
- 하지만 중간에 추가할 경우 추가한 위치의 다음부터 끝까지 한칸씩 뒤로 밀리기 때문에 성능이 지연됩니다.
연관 컨테이너 : unorderd_map
- unordered_map
▶️ vector
vector의 선언과 값 추가
// 백터 선언
std::vector <int> vecInt;
// 맨 뒤에 값을 추가하는 push_back()과 emplace_back()
// push_back() : 복사 생성 혹은 이동생성이 일어나게 됨.
// 인자로 들어가는 값이 임시객체일 경우 이동생성이 됨
vecInt.push_back(10);
// emplace_back() : 직접생성방식
// 인자를 이용하여 이 벡터의 내부 메모리에서 객체 생성
vecInt.emplace_back(20);
▶️ vector의 함수들
std::vector<int> vecInt;
vecInt.push_back(10);
vecInt.push_back(20);
// 랜덤 엑세스가 가능
std::cout << vecInt[0] << std::endl;
std::cout << vecInt.at(1) << std::endl;
// front() : 첫번째 요소를 가저온다
std::cout << vecInt.front() << std::endl;
// back() : 마지막 요소를 가저온다
std::cout << vecInt.back() << std::endl;
// pop_back() : 가장 마지막 요소를 제거
vecInt.pop_back();
// clear() : 전체 요소를 제거
vecInt.clear();
// size() : 추가된 갯수를 얻어온다.
std::cout << "size : " << vecInt.size() << std::endl;
// capacity() : 배열 전체 개수를 얻어온다.
std::cout << "capacity : " << vecInt.capacity() << std::endl;
// empty() : 배열이 비어있는지 확인. 실제 추가된게 없을 경우 true, 아니면 false를 반환
std::cout << "empty : " << vecInt.empty() << std::endl;
▶️ vector의 size와 capacity의 차이
- size() : 현재 벡터 배열에서 몇개의 element가 존재하는지 리턴
- capacity() : 현재 벡터 배열에서 재할당 없이 몇개의 element를 담을 수 있는지 리턴
- capacity는 배열이 추가되어 늘어나야 할 경우 1.5배씩 (정수로) 늘어나게 됩니다.
std::vector<int> vecint;
//초기 전체 배열 개수
std::cout << "capacity : " << vecint.capacity() << std::endl;
for(int i = 0 ; i < 10 ; i++)
{
vecint.push_back( i * 100 );
std::cout << "size : " << vecint.size() << ", capacity : " << vecint.capacity() << std::endl;
}
▶️ reserve(), resize()
- 위와같이 자동으로 공간을 재할당하게 되면 배열이 추가될 때마다 늘어난 크기를 대응하기 위해
공간 재할당이 일어나기 때문에 성능에 좋지 않습니다.
공간을 미리 할당할수 있게 크기를 지정하여 할당 해주는 함수가 resize()와 reserve() 입니다.
- reserve() : 배열의 여유 공간(capacity)을 원하는 만큼 늘려줍니다.
std::vector<int> vecint;
std::cout << "size : " << vecint.size ()
<< ", capacity : " << vecint.capacity () << "\n" << std::endl;
vecint.reserve ( 5 );
std::cout << "size : " << vecint.size ()
<< ", capacity : " << vecint.capacity () << "\n" << std::endl;
for (int i = 0 ; i < 10 ; i++)
{
vecint.push_back ( i * 100 );
std::cout << "size : " << vecint.size ()
<< ", capacity : " << vecint.capacity () << std::endl;
}
- resize() : 배열 공간(size)을 원하는 만큼 늘려줍니다
std::vector<int> vecint;
std::cout << "size : " << vecint.size ()
<< ", capacity : " << vecint.capacity () << "\n" << std::endl;
vecint.resize ( 5 );
std::cout << "size : " << vecint.size ()
<< ", capacity : " << vecint.capacity () << "\n" << std::endl;
for (int i = 0 ; i < 10 ; i++)
{
vecint.push_back ( i * 100 );
std::cout << "size : " << vecint.size ()
<< ", capacity : " << vecint.capacity () << std::endl;
}
=> 배열 공간이 다 찬다면, 추가 공간 크기는 기존과 동일하게 1.5배로 늘어나게 됩니다.
=> 배열을 몇개를 쓸건지 명확하다면, 미리 공간 크기를 예약해서 할당하여 그 공간만 사용하는게 성능면에서 이득입니다. 벡터를 최적화 하는 방법 중 하나입니다.
728x90
'개발개발 > c++' 카테고리의 다른 글
c++의 참조변수 (reference variable) (0) | 2024.12.29 |
---|---|
템플릿 - 비타입 인자, 템플릿 특수화, 템플릿 가변인자 (0) | 2024.12.26 |
C++ 오퍼레이터, assert (2) | 2024.12.23 |
c++ 템플릿 (0) | 2024.12.22 |
c++의 임시객체 (0) | 2024.12.20 |
댓글