본문 바로가기

C

c++ 벡터 remove, remove_if 사용 기록

remove_if를 쓰면 lambda 함수를 적용해서 효율적으로 원소를 제거할 수 있다.

기본 원소뿐만아니라 벡터 또한 삭제할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
class Cat
{
public:
    Cat(std::string name, int age) :mName{ std::move(name) }, mAge{ age } {};
    void speak() const
    {
        std::cout << "meow" << mName << " " << mAge << std::endl;
    }
    int age() const {
        return mAge;
    }
 
private:
    std::string mName;
    int mAge;
 
};
 
// 벡터 내부에서 벡터의 사이즈가 변경되면 for loop 을 쓴다.
int main()
{
 
    /// Remove Version
 
    std::vector<int> nums{ 0,1,0,1,0,1,0 };
    //std::remove는 1이 마지막으로 나오는 iterator를 가리키는 아웃풋 냄
 
    nums.erase(std::remove(nums.begin(), nums.end(), 0), nums.end());
    for (int num : nums)
    {
        std::cout << num << " ";
 
    }
    std::cout << std::endl;
 
 
    /// Remove_if Version
 
    std::vector<int> nums2{ 0,1,2,3,4,5,6 };
    nums2.erase(std::remove_if(nums2.begin(), nums2.end(), [](int n) {
        if (n % 2 == 0)
        {
            return true;
        }
        return false;
        }), nums2.end());
 
    for (int num : nums2)
    {
        std::cout << num << " ";
 
    }
    std::cout << std::endl;
 
 
    /// Class Version
 
    std::vector<Cat> cats;
    cats.reserve(4);
 
    cats.emplace_back("cat1"1);
    cats.emplace_back("cat2"2);
    cats.emplace_back("cat3"3);
    cats.emplace_back("cat4"4);
 
    cats.erase(std::remove_if(cats.begin(), cats.end(), [](const Cat& cat) {
        if (cat.age() % 2 == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
        }), cats.end());
 
    for (const Cat& cat : cats)
    {
        cat.speak();
 
    }
 
    return 0;
}