[std] Vector

2020. 3. 21. 10:29·C/C++

 

 

STL (Standard Template Libaray) 가장 기본적인 data structure

[정의]

길이(크기)가 가변적인 array list

♣ Vector의 Capacity (할당된 메모리 공간의 크기)를 넘어서는 시점에서 자동으로 메모리 재할당 및 기존 원소값들의 복사가 발생하는 원리로 크기의 가변성을 보장한다.

 

 


[Time Complexity Analysis]

  • 임의의 위치 접근 (index 사용) : O(1)
  • 맨 뒤 원소 삽입/삭제 : amortized O(1)
  • 임의의 위치 원소 삽입/삭제: O( N + M ) // N: 삽입될 원소 갯수, M: 해당 원소 인덱스 뒤의 원소 갯수 (한칸 씩 뒤로 밀어줘야 함) 
분류 임의의 위치 접근 맨 뒤 원소 삽입/삭제 임의의 위치 원소 삽입/삭제
Function name at, [] push_back / pop_back insert / erase
Time Complexity O(1) amortized O(1)

O(N + M) 

N: 삽입, 삭제할 원소 갯수

M: 원소의 이동 갯수

(해당 원소 이전 or 이후 원소 갯수)

 

※ amortized O(1) : vector의 capacity가 16이라고 했을 때 16개를 넘어가는 즉 , vector[16]에 원소를 삽입할 때는

기존에 할당된 배열이 아니라 추가로 배열을 할당한다. (기존 배열의 주소는 해제되고  모든 배열이 복사된다, 

따라서 Vector가 가지고있던 원소 갯수만큼 복사가 일어나므로 O(N)이된다.)

 

※ M: 배열에서의 삽입/삭제는 원소를 한칸씩 당겨오는 작업 or 밀어내는 작업 이 필요하게된다.

이 그림 하나로 배열에서의 임의 위치 삽입/삭제가 O(N)을 갖는다는 것을 알 수 있다.

 

 


[용도]

임의의 위치에 접근(참조) + 순차적인 삽입/삭제(특히 맨 끝자리)가 이루어질 때 배열 대신 사용하기 편하다. 
∵ 길이를 알아서 가변적으로 할당해주기 때문이다.

Ω 임의 위치 삽입/삭제가 빈번하게 일어나거나, 원소 갯수가 아주 자주 바뀌는 경우 시간 복잡도가 O(N)이기 때문에 효율적이지 못하다.

 

[예제]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <algorithm>
int main(void) {
    std::vector<int> vec;
    std::vector<int>::iterator itr;
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(40);
    vec.push_back(30);
    vec.push_back(5);
    sort(vec.begin(), vec.end());
    for(itr = vec.begin(); itr != vec.end(); ++itr) {
        std::cout << *itr << " ";
    }
    std::cout << '\n';
//    size explain the number of elements this vector has
    std::cout << "this vector size : " << (int) vec.size() << std::endl;
//    capacity explain how much memory space this vector is allocated 
    std::cout << "this vector capacity: " << (int) vec.capacity() << std::endl;
    return 0;
}
 

[Reference]

http://www.cplusplus.com/reference/vector/vector/insert/

 

저작자표시 (새창열림)

'C > C++' 카테고리의 다른 글

[C++ 11] NULL vs nullptr  (0) 2020.03.21
[C++] auto  (0) 2020.03.21
C++ Naming Rule (Feat. Google C++ Guide)  (0) 2020.03.08
cmath, math.h (feat. 백준 3053 택시 기하학)  (0) 2019.12.08
Copy Constructor  (0) 2019.11.20
'C/C++' 카테고리의 다른 글
  • [C++ 11] NULL vs nullptr
  • [C++] auto
  • C++ Naming Rule (Feat. Google C++ Guide)
  • cmath, math.h (feat. 백준 3053 택시 기하학)
M_Falcon
M_Falcon
  • M_Falcon
    Falcon
    M_Falcon
  • 전체
    오늘
    어제
    • 분류 전체보기 (432)
      • Web (16)
        • Nodejs (14)
        • Javascript (23)
        • FrontEnd (4)
      • DataBase (39)
        • Fundamental (1)
        • Redis (4)
        • PostgreSQL (10)
        • NoSQL (4)
        • MySQL (9)
        • MSSQL (3)
        • Error (4)
      • Algorithm (79)
        • Algorithm (문제풀이) (56)
        • Algorithm (이론) (23)
      • JVM (65)
        • Spring (13)
        • JPA (5)
        • Kotlin (13)
        • Java (24)
        • Error (7)
      • 기타 (70)
        • Kafka (3)
        • Kubernetes (3)
        • Docker (13)
        • git (19)
        • 잡동사니 (27)
      • 재테크 (11)
        • 세무 (4)
        • 투자 (3)
        • 보험 (0)
      • BlockChain (2)
        • BitCoin (0)
      • C (32)
        • C (10)
        • C++ (17)
        • Error (3)
      • Low Level (8)
        • OS (3)
        • 시스템 보안 (5)
      • 네트워크 (3)
      • LINUX (30)
        • Linux (26)
        • Error (4)
      • 저작권과 스마트폰의 이해 (0)
      • 생각 뭉치 (6)
      • 궁금증 (2)
      • Private (4)
        • 이직 경험 (0)
        • 꿈을 찾아서 (1)
      • Android (21)
        • OS (4)
  • 블로그 메뉴

    • 홈
    • WEB
    • 알고리즘
    • DataBase
    • Linux
    • Mobile
    • C
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    javascript
    JPA
    Kotlin
    android
    백준
    Programmers
    database
    Git
    kafka
    Bitcoin
    linux
    java
    Spring
    algorithm
    docker
    프로그래머스
    PostgreSQL
    ubuntu
    C++
    알고리즘
  • hELLO· Designed By정상우.v4.10.3
M_Falcon
[std] Vector
상단으로

티스토리툴바