Make Unreal REAL.
article thumbnail
코딩 테스트를 위한 자료 구조와 알고리즘 with C++

 

 

std::array의 문제점

  • Compile time에 크기가 정해져야 하며 실행 도중 변경할 수 없다.
  • 크기가 고정되어 있어 원소의 추가, 삭제가 불가능하다.
  • 항상 스택 영역을 사용한다.

 

std::vector

  • 공간이 부족할 경우 크기가 동적으로 늘어난다.
    - 보통 2배
  • 크기와 용량이 별도로 존재한다.
  • 두 벡터의 크기가 달라도 비교 연산이 지원된다.

 

std::vector의 성능

  • 맨 뒤에 삽입 시 크기가 충분하면 O(1), 부족하면 모든 원소를 새로운 메모리에 복사해야 하므로 O(n)
  • 중간에 원소를 삽입하는 경우 O(n)

 

std::vector의 원소 삽입 의사 코드

push_back(val):
    if size < capacity
        data[size++] = val
        
    else
        new_data = new [2 * size]
        capacity = 2 * size
        copy data -> new_data
        data = new_data
        data[size++] = val

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template <typename T>
ostream& operator<<(ostream& os, const vector<T>& vec)
{
    for (T e : vec)
        os << e << ' ';

    return os;
}

void main()
{
    // 크기가 10인 벡터
    vector<int> vec1(10);
    // 크기가 5이고 모든 값이 3으로 초기화된 벡터
    vector<int> vec2(5, 3);
    // 배열을 통한 초기화
    vector<int> vec3({1, 2, 3, 4, 5});
    // 벡터를 통한 초기화
    vector<int> vec4(vec3);
    // 반복자 범위를 통한 초기화
    vector<int> vec5(vec4.begin(), vec4.end());

    try
    {
        // [] 대신 at을 통해 범위 검사
        vec1[0] = vec5.at(6);
    }
    catch (const out_of_range& ex)
    {
        cerr << ex.what() << endl;
    }

    // 첫 번째 원소의 참조
    vec5.front() = 6;
    // 마지막 원소의 참조
    vec5.back() = 3;

    // 맨 뒤에 9 추가
    // vec5.push_back(9);
    vec5.emplace_back(9);

    // 맨 앞에 0 추가
    // vec5.insert(vec.begin(), 0);
    vec5.emplace(vec5.begin(), 0);

    // 2 앞에 8 추가
    vec5.emplace(find(vec5.begin(), vec5.end(), 2), 8);

    cout << vec5 << endl;

    // 맨 뒤의 원소 삭제
    vec5.pop_back();

    // 맨 앞의 원소 삭제
    vec5.erase(vec5.begin());

    // 1번째부터 2번째 원소까지 삭제
    vec5.erase(vec5.begin() + 1, vec5.begin() + 3);

    cout << vec5 << endl;

    // 벡터의 시작 주소, 크기, 용량
    cout << vec5.data() << ", " << vec5.size() << ", " << vec5.capacity() << endl;

    // 용량을 100으로 변경
    // 전달된 용량이 현재 용량보다 크면 메모리가 재할당된다.
    vec5.reserve(100);
	
    // 벡터의 시작 주소, 크기, 용량
    cout << vec5.data() << ", " << vec5.size() << ", " << vec5.capacity() << endl;

    // 용량을 크기와 같게 만들어 메모리 낭비를 줄인다.
    vec5.shrink_to_fit();

    // 벡터의 시작 주소, 크기, 용량
    cout << vec5.data() << ", " << vec5.size() << ", " << vec5.capacity() << endl;

    // 모든 원소가 큰지 확인
    cout << boolalpha << (vec3 < vec4) << endl;
    // 모든 원소가 같은지 확인
    cout << boolalpha << (vec3 == vec5) << endl;

    // 벡터 초기화
    vec5.clear();
}

 

출력

vector::_M_range_check: __n (which is 6) >= this->size() (which is 5)
0 6 8 2 3 4 3 9 
6 3 4 3 
0x556f38659070, 4, 10
0x556f386594b0, 4, 100
0x556f38658f40, 4, 4
false
false

'자료구조 & 알고리즘 > 코딩 테스트를 위한 자료 구조와 알고리즘 with C++' 카테고리의 다른 글

반복자(Iterator)  (0) 2023.01.25
std::forward_list  (0) 2023.01.24
동적 크기 배열 구현  (0) 2023.01.21
std::array  (0) 2023.01.20
연결 리스트  (0) 2023.01.19
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그