728x90

 

Vector
  • 동적인 요소를 할당할 수 있는 동적배열
  • 만약 컴파일 시점에 사용해야 할 요소들의 개수를 모른다면 vector를 사용해야 한다.

 

특징
  • 연속된 메모리 공간에 위치한 같은 타입의 요소들의 모음
  • 숫자인덱스를 기반으로 랜덤접근이 가능
  • 중복을 허용

 

시간 복잡도
  • 탐색과 맨 뒤의 요소를 삭제하거나 삽입하는데 O(1)
  • 맨 뒤나 맨 앞이 아닌 요소를 삭제하고 삽입하는데 O(n) 

 

선언 
vector<타입> 변수명;
  • 위와 같이 선언한다
  • 예를 들어 int형 vector를 정의하고 싶다면 vector<int>로 정의
  • 이는 다른 자료구조도 동일

 

예시 코드
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int main(){
    for(int i = 1; i <= 10; i++)v.push_back(i);
    for(int a: v) cout << a << " ";
    cout << "\n";
    v.pop_back();
    
    for(int a : v) cout << a << " ";
    cout << "\n";
    
    v.erase(v.begin(), v.begin() + 3);
    
    for(int a : v) cout << a << " ";
    cout << "\n";
    
    auto a = find(v.begin(), v.end(), 100);
    if(a == v.end()) cout << "not found" << "\n";
    
    fill(v.begin(), v.end(), 10);
    for(int a : v) cout << a << " ";
    cout << "\n";
    v.clear();
    cout << "아무것도 없을까?\n";
    for(int a : v) cout << a << " ";
    cout << "\n";
    return 0;    
}
/*
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9
not found
10 10 10 10 10 10
아무것도 없을까?
*/

 

method
  • push_back()
    • vector의 뒤에서부터 요소를 더한다. 
    • emplace_back()과 동일 - 더 빠르지만 시간차이 많이 안난다.
  • pop_back()
    • vector 맨 뒤의 요소를 지운다.
  • erase() 
    • 한 요소만을 지운다면 erase(위치)로 쓰이지만
    • (from, to]로 지우고 싶다면 
    • erase(from, to)를 통해 지운다.
iterator erase (const_iterator position);


iterator erase (const_iterator first, const_iterator last);

 

 

※ 참고 - ( 와 ) 는 해당요소를 포함하지 않는 구간, [ 와 ] 는 해당 요소를 포함한다는 수학적 기호

 

 

  • find(from, to, value)
    • vector의 메서드가 아닌 STL 함수
    • [from, to) 에서 value를 찾는다.
    • vector내의 요소들을 찾고 싶을 때 이를 통해 찾는다.
    • O(n)의 시간복잡도
  • clear()
    • vector의 모든 요소를 지운다.
  • fill(from, to, value)
    • vector 내의 value로 값을 할당하고 싶다면 fill을 써서 채운다.
    • 보통 이를 ~~한 값으로 초기화라고 부른다.
    • [from, to) 구간에 value를 초기화 한다.
  • 범위기반 for 루프
    • 앞에서 한 번 다뤘었는데 다시 보자
    • 아래 두 코드는 동일한 의미이다.
    • vector 등 컨테이너의 요소들을 간편하게 탐색할 때 사용
    • Array, 연결리스트, 맵, 셋을 탐색할 때도 사용
    • pair를 담고 있다면 pair<int, int> a 로 들어가야됨
for(int a : v)
for(int i = 0; i < v.size(); i++)

vector<pair<int, int>> v2;
for(pair<int, int> a : v2) cout << a.first << " ";

 

정적할당
  • vector라고 해서 무조건 크기가 0인 빈 vector를 만들어 동적할당으로 요소를 추가하는 것은 아니다.
  • 애초에 크기를 정해놓거나 해당 크기에 대해 어떠한 값으로 초기화 해놓고 시작 가능
#include <bits/stdc++.h>
using namespace std;
vector<int> v(5,100);
int main() {
    for(int a : v) cout << a << " ";
    cout << "\n";
    return 0;
}

/*
100 100 100 100 100
*/

 

 

 

2차원 배열
  • vector를 이용한 2차원 배열을 만드는 방법은 3가지 존재
    • vector를 중첩해서 만든 v
    • vector를 중첩해서 만들고 0이란 값으로 초기화 -> 2차원 배열은 v와 10*10 크기, 0으로 초기화된 v2를 볼 수 있다.
    • 반복문을 통해 vector 중첩 시키기
#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> v;
vector<vector<int>> v2(10, vector<int>(10,0));
vector<int> v3[10];
int main(){
    for(vector<int> v : v2){
        for(int i : v) cout << i << ' ';
        cout << '\n';
    }
    for(int i = 0; i < 10; i++){
        vector<int> vv;
        v.push_back(vv);
    }
    return 0;
}

 

 

 

728x90

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

[C++] map, unordered_map with Cpp  (1) 2023.12.20
[C++] list with Cpp  (2) 2023.12.20
[C++] Array with Cpp  (1) 2023.12.20
[C++] auto와 람다식  (0) 2023.12.20
[C++] 표준 템플릿 라이브러리(STL)  (0) 2023.12.20