article thumbnail image
Published 2021. 7. 20. 22:50

vector에서 원소 하나를 삭제하는 시간복잡도는 O(N)이다.

값으로 삭제

vector<> v; 라고 선언된 벡터에서 특정한 원소를 지울 때 아래와 같이 할 수 있습니다.

v.erase(remove(v.begin(), v.end(), 지우고 싶은 원소), v.end());

remove는 특정 값을 찾아서 완전히 지우는 것이 아닌, 벡터의 뒤로 보내기 때문에 추가로 erase를 해줘야 한다.

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

using namespace std;

int main() {
    vector<int> v = {1, 2, 3, 5, 10};

    cout << "원래 배열 : ";
    for (auto i : v) cout << i << " ";
    cout << endl;
    
    v.erase(remove(v.begin(), v.end(), 3), v.end()); // 원소 3 지우기

    cout << "지운 후 : ";
    for (auto i : v) cout << i << " ";
}

출력값

 

조건문으로 삭제

조건문을 걸어 조건문에 해당하는 원소들을 지울 때는 remove_if를 이용하면 됩니다.

remove_if의 세번째 인자에는 함수가 들어가기 때문에 람다 함수를 이용하면 편하게 사용할 수 있습니다.

vector<int> v = {1, 2, 3, 3, 4};
v.erase(remove_if(v.begin(), v.end(), [](auto x) -> bool { return x >= 3; }), v.end());
for (auto x : v) cout << x << " ";

# 출력값 : 1 2

 

인덱스로 삭제

인덱스로 지우고 싶을 때는 아래와 같이 지울 수 있습니다.

v.erase(v.begin() + idx)

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

[C/C++] Sequencing (Sequence Point)  (0) 2022.05.01
[C/C++] printf에 float만을 위한 변환 명세가 없는 이유  (0) 2022.04.28
[C++] lower_bound vs upper_bound  (0) 2021.10.15
[C++] string split구현  (0) 2021.09.11
[C++] Structured binding  (0) 2021.07.21
복사했습니다!