Super Kawaii Cute Cat Kaoani [C++] <vector>

[C++] <vector>

2024. 1. 26. 01:00
728x90
SMALL

📌 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() : 삽입된 요소를 가리키는 반복자를 반환
      ➡ 삽입된 요소의 위치를 알려주는 역할
    • emplace() : 삽입된 요소를 가리키는 새로운 반복자를 반환
  • 사용 시점
    • insert() : 이미 생성된 요소를 삽입할 때 사용
      ➡ ex) 다른 컨테이너나 배열의 요소를 벡터에 복사하여 추가할 때 사용
    • emplace() : 요소를 생성하여 삽입할 대 사용
      ➡ 생성자의 매개변수를 직접 전달하여 요소를 생성하고 벡터에 추가

 

✔ emplace_back()

template <class... Args>
void emplace_back(Args&&... args);
  • 벡터의 마지막 부분에 새로운 요소 추가 
  • 생성자 인수 args를 사용하여 새로운 요소를 생성하고 벡터의 맨 뒤에 추가
  • 생성된 요소는 기존 요소들의 오른쪽에 추가
  • 반환값이 없으며, 벡터의 크기가 증가

 

 emplace_back()와 push_back()의 차이점

  • 요소 추가
    • push_back() : 벡터에 이미 생성된 요소를 추가
      ➡ 요소를 복사하여 벡터에 추가하는 동작을 수행
    • emplace_back() : 생성자 인수를 사용하여 요소를 직접 생성하여 벡터에 추가
      ➡ 새로운 요소를 생성하는 동작을 수행
  • 인수 전달
    • push_back() : 추가하려는 요소를 값으로 전달
      ➡ 요소를 복사한 후 벡터에 추가
    • emplace_back() : 생성자 인수를 전달하여 새로운 요소를 생성
      ➡ 생성자의 매개변수를 직접 전달하여 요소를 생성
  • 복사 비용
    • push_back() : 추가하려는 요소를 복사하여 벡터에 추가하므로, 요소의 복사 연산이 필요
    • emplace_back() : 생성자 인수를 사용하여 요소를 직접 생성하므로, 복사 연산 없이 요소를 추가 가능
  • 반환값
    • push_back() : 추가된 요소를 가리키는 반복자(iterator)를 반환
      ➡ 추가된 요소의 위치를 알려주는 역할
    • emplace_back() : 반환값이 없으며, 추가된 요소를 가리키는 새로운 반복자를 반환하지 않음
  •  

 

✔ 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 지점을 끝부분으로 반환

출처 :  https://en.cppreference.com/w/cpp/container/vector/begin

 

출처 :  https://en.cppreference.com/w/cpp/container/vector/rend



728x90
LIST

'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

BELATED ARTICLES

more