728x90
반응형
📌 0. 벡터란
- 메모리 heap에 생성되며 동적할당됨
- 장점 : 메모리를 효율적으로 관리하고 예외처리가 쉬움
- 단점 : 속도적인 측면에서 배열에 비해 성능은 떨어짐
📌 1. 벡터의 초기화
- vector< 자료형 > 변수명 : 벡터 생성
- vector< 자료형 > 변수명(숫자) : 숫자만큼 벡터 생성 후 0으로 초기화
- vector< 자료형 > 변수명 = {변수1, 변수2, 변수3, ...} : 벡터 생성 후 오른쪽 변수 값으로 초기화
- vector< 자료형 > 변수명[] = {,} : 벡터 배열(2차원 벡터)선언 및 초기화(행은 가변, 열은 고정)
- vector< vector <자료형>> 변수명 : 2차원 벡터(행과 열 모두 가변)
- vector< 자료형 >변수명.assign(범위, 초기화할 값) : 벡터의 범위 내에서 해당 값으로 초기화
⚡ 예시
vector<int> v; //int형 벡터 생성
vector<int>v(3); //int형 벡터 생성 후 크기를 3로 할당(모든 벡터 요소 0으로 초기화)
vector<int>v = {1, 2, 3}; //int형 벡터 생성 후 1, 2, 3으로 초기화
vector<int>v[] = {{1,2}, {3,4}}; //int형 벡터 배열 생성(행은 가변, 열은 고정)
vector<vector<int>> v; //2차원 벡터 생성(행과 열 모두 가변)
vector<int> v = {1, 2, 3, 4, 5};
v.asign(5, 10) //벡터 범위를 5로 지정하고 정수 10으로 초기화
📌 2. 벡터 선언
std::vector < T > vec;
📌 3. 요소 추가 및 제거
✔ push_back()
void push_back(const T& value);
- 벡터 뒤쪽에 요소를 추가
- value : 추가할 요소의 값
✔ pop_back()
void pop_back();
- 벡터 뒤쪽의 요소 제거
- 벡터의 크기 1 감소
✔ insert()
iterator insert(iterator pos, const T& value);
- 지정된 위치에 요소를 삽입
- 벡터의 크기 1 증가
- pos: 삽입할 위치를 가리키는 반복자(iterator)
- value: 삽입할 요소의 값
✔ emplace()
template <class... Args>
iterator emplace(iterator pos, Args&&... args);
- 사용자가 원하는 위치에 요소 삽입
- pos: 삽입할 위치를 가리키는 반복자(iterator)
- args: 새로운 요소를 생성하기 위한 생성자 인수
❗ insert와 emplace의 차이점
- 복사 vs 직접 생성
- insert() : 삽입하려는 요소를 복사하여 벡터에 추가
- emplace() : 요소를 직접 생성하여 벡터에 추가
➡ 별도의 복사 연산 없이 생성자 인수를 사용하여 새로운 요소 생성
- 인수 전달
- insert() : 삽입하려는 요소를 값 또는 범위로 전달
➡ 요소를 복사한 후 벡터에 추가 - emplace() : 새로운 요소를 생성하기 위한 생성자 인수를 전달
➡ 생성자의 매개변수를 직접 정달하여 요소를 생성
- insert() : 삽입하려는 요소를 값 또는 범위로 전달
- 반환값
- insert() : 삽입된 요소를 가리키는 반복자를 반환
➡ 삽입된 요소의 위치를 알려주는 역할 - emplace() : 삽입된 요소를 가리키는 새로운 반복자를 반환
- insert() : 삽입된 요소를 가리키는 반복자를 반환
- 사용 시점
- insert() : 이미 생성된 요소를 삽입할 때 사용
➡ ex) 다른 컨테이너나 배열의 요소를 벡터에 복사하여 추가할 때 사용 - emplace() : 요소를 생성하여 삽입할 대 사용
➡ 생성자의 매개변수를 직접 전달하여 요소를 생성하고 벡터에 추가
- insert() : 이미 생성된 요소를 삽입할 때 사용
✔ emplace_back()
template <class... Args>
void emplace_back(Args&&... args);
- 벡터의 마지막 부분에 새로운 요소 추가
- 생성자 인수 args를 사용하여 새로운 요소를 생성하고 벡터의 맨 뒤에 추가
- 생성된 요소는 기존 요소들의 오른쪽에 추가
- 반환값이 없으며, 벡터의 크기가 증가
❗ emplace_back()와 push_back()의 차이점
- 요소 추가
- push_back() : 벡터에 이미 생성된 요소를 추가
➡ 요소를 복사하여 벡터에 추가하는 동작을 수행 - emplace_back() : 생성자 인수를 사용하여 요소를 직접 생성하여 벡터에 추가
➡ 새로운 요소를 생성하는 동작을 수행
- push_back() : 벡터에 이미 생성된 요소를 추가
- 인수 전달
- push_back() : 추가하려는 요소를 값으로 전달
➡ 요소를 복사한 후 벡터에 추가 - emplace_back() : 생성자 인수를 전달하여 새로운 요소를 생성
➡ 생성자의 매개변수를 직접 전달하여 요소를 생성
- push_back() : 추가하려는 요소를 값으로 전달
- 복사 비용
- push_back() : 추가하려는 요소를 복사하여 벡터에 추가하므로, 요소의 복사 연산이 필요
- emplace_back() : 생성자 인수를 사용하여 요소를 직접 생성하므로, 복사 연산 없이 요소를 추가 가능
- 반환값
- push_back() : 추가된 요소를 가리키는 반복자(iterator)를 반환
➡ 추가된 요소의 위치를 알려주는 역할 - emplace_back() : 반환값이 없으며, 추가된 요소를 가리키는 새로운 반복자를 반환하지 않음
- push_back() : 추가된 요소를 가리키는 반복자(iterator)를 반환
✔ erase()
- 단일요소 삭제 : iterator를 사용하여 벡터에서 특정 위치의 요소를 삭제
std::vector<int> vec = {1, 2, 3, 4, 5}; vec.erase(vec.begin() + 2);
- 범위 삭제 : 시작과 끝 반복자(iterator)를 지정하여 벡터에서 해당 범위의 요소를 삭제할 수도 있음
std::vector<int> vec = {1, 2, 3, 4, 5}; vec.erase(vec.begin() + 2, vec.begin() + 4);
- 요소를 삭제한 후 벡터의 크기 변경
- 삭제된 요소를 반환하지 않으며 삭제된 요소의 개수도 반환하지 않음
✔ clear()
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.clear();
- 벡터의 모든 요소를 지움
- 벡터의 size는 0이 됨
✔ resize()
std::vector<int> vec = {1, 2, 3}; vec.resize(5);
- 벡터의 사이즈 조정
- 범위 초과시 0으로 초기화
- 크기 늘리기
- 현재 크기보다 늘리려는 크기가 더 크다면 추가된 부분은 기본값으로 초기화됨
- 크기 줄이기
- 현재 크기보다 줄이려는 크기가 더 작다면 초과된 부분은 삭제
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.resize(3);
✔ swap()
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = {4, 5, 6};
vec1.swap(vec2);
- 벡터와 벡터를 교환
📌 4. 크기 관리
✔ size()
std::vector<int> vec = {1, 2, 3, 4, 5};
int size = vec.size();
- 벡터의 현재 요소 개수를 반환
✔ empty()
std::vector<int> vec = {1, 2, 3, 4, 5};
bool isEmpty = vec.empty();
- 벡터가 비어 있는지 여부를 확인
- 비어있다면 : true 반환
- 비어있지 않다면 : false 반환
✔ resize()
std::vector<int> vec = {1, 2, 3};
vec.resize(5);
- 벡터의 크기를 변경
✔ capacity()
std::vector<int> vec = {1, 2, 3, 4, 5};
int capacity = vec.capacity();
- heap에 할당된 벡터의 실제 크기(최대 크기) 반환
- 벡터의 용량을 알 수 있음
✔ max_size()
std::vector<int> vec;
size_t maxSize = vec.max_size();
- 벡터가 system에서 만들어 질 수 있는 최대 크기 반환
- 운영체제나 컴파일러에 따라 다를 수 있음
✔ reserve()
std::vector<int> vec;
vec.reserve(100); // 벡터에 100개의 요소를 저장할 메모리를 미리 확보
- 벡터의 크기 설정
- 벡터에 미리 메모리 할당
- 미리 벡터의 용량을 확보하면, 요소를 추가할 때 매번 메모리를 재할당하는 비용을 줄일 수 있음
- 용량을 확보하는 것이지 실제로 요소를 추가하는 것은 아니므로 벡터의 크기는 변하지 않음
- resize()를 이용해 벡터의 크기를 함께 조정
✔ shrink_to_fit()
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.erase(vec.begin() + 2, vec.end()); // 일부 요소 삭제
vec.shrink_to_fit(); // 용량 조정
- capacity의 크기를 벡터의 실제 크기에 맞춤
- 벡터의 용량을 요소 개수에 최적화된 크기로 줄여줌
- 용량을 조정하는 것이므로, 실제로 요소를 삭제하거나 추가하지는 않음
- erase() 함수 등을 사용하여 불필요한 요소를 삭제한 후에 이 함수를 호출하여 용량 최적화
📌 5. 요소 접근
✔ operator[ ]
std::vector<int> vec = {1, 2, 3, 4, 5};
int element = vec[2]; // 인덱스 2의 요소 읽기
vec[3] = 10; // 인덱스 3의 요소 수정
- 인덱스를 사용하여 특정 위치의 요소에 접근(읽거나 수정)
✔ at()
std::vector<int> vec = {1, 2, 3, 4, 5};
int element = vec.at(2); // 인덱스 2의 요소 읽기
vec.at(3) = 10; // 인덱스 3의 요소 수정
- 인덱스를 사용하여 특정 위치의 요소에 접근하며, 범위 검사를 수행
- []와 유사한 기능을 제공하지만, at()은 인덱스 범위를 확인하여 유효성 검사를 하고 인덱스가 벗어나는 경우 예외를 발생시킴
✔ front()
std::vector<int> vec = {1, 2, 3, 4, 5};
int firstElement = vec.front(); // 첫 번째 요소 읽기
vec.front() = 10; // 첫 번째 요소 수정
- 첫 번째 요소에 접근
- 해당 요소가 존재해야 함
- 비어있는 경우 front를 호출하면 정의되지 않은 동작이 발생할 수 있음
✔ back()
std::vector<int> vec = {1, 2, 3, 4, 5};
int lastElement = vec.back(); // 마지막 요소 읽기
vec.back() = 10; // 마
- 마지막 요소에 접근
- 해당 요소가 존재해야 함
- 비어있는 경우 front를 호출하면 정의되지 않은 동작이 발생할 수 있음
📌 6. Iterators
✔ begin()
- 벡터 시작점의 주소 값 반환
✔ end()
- 벡터 끝부분 + 1 주소값 반환
✔ rbegin()
- 벡터의 끝 지점을 시작점으로 반환
✔ rend()
- 벡터의 시작+1 지점을 끝부분으로 반환
728x90
반응형
'Language > C++' 카테고리의 다른 글
[C++] class VS 구조체 (0) | 2024.01.26 |
---|---|
[C++] priority queue (우선순위 큐) 란? (0) | 2024.01.26 |
[C++] <algorithm> (1) | 2024.01.22 |
[C++] find()함수 (0) | 2024.01.22 |
[C++] cpp의 기본 내용 정리 (1) | 2024.01.22 |