C++ – remove, remove_if, lambda

By | 2023년 6월 27일
Table of Contents

C++ – remove, remove_if, lambda

remove(), remove_if() 함수의 사용법을 정리해 봅니다.

remove

#include <iostream>
#include <string>
#include <list>
#include <algorithm>

using namespace std;

int main() {
    list<string> string_list;

    string_list.push_back("1111");
    string_list.push_back("2222");
    string_list.push_back("3333");
    string_list.push_back("4444");

    // g++ test.cpp

    list<string>::iterator iter;
    for (iter = string_list.begin(); iter != string_list.end(); iter++) {
        cout << iter->c_str() << endl;
    }

    // 리스트 사이즈가 바뀌지 않는다.
    remove(string_list.begin(), string_list.end(), "2222");

    for (iter = string_list.begin(); iter != string_list.end(); iter++) {
        cout << iter->c_str() << endl;
    }
}

lambda

아래에서 람다식을 사용하게 되는데 그전에 람다식을 설명합니다.

[변수캡쳐](파라미터)->int{ return 계산식; }

외부 변수를 함수내부에서 사용하기 위해 변수 캡쳐를 생성할 수 있습니다.
변수가 필요없다면 [] 와 같이 비어있는 형식으로도 가능합니다.

리턴값을 생략가능하며 생략되면 컴파일러가 자동으로 유추합니다.

    auto it_test = remove_if(string_list.begin(), string_list.end(), 
        [str1, str2](string str) {
            return (str.compare(str1) == 0) || str.compare(str2) == 0;
        }
    );

위 예제에서 외부변수 두개를 받아왔고,
리스트에서 파라미터를 받습니다.
리턴값을 생략되었는데 컴파일러가 자동으로 bool 설정해 줍니다.

remove_if

#include <iostream>
#include <string>
#include <list>
#include <algorithm>

using namespace std;

int main() {
    list<string> string_list;

    string_list.push_back("1111");
    string_list.push_back("2222");
    string_list.push_back("3333");
    string_list.push_back("4444");

    string str1 = "2222";
    string str2 = "3333";

    // g++ test.cpp

    list<string>::iterator iter;
    for (iter = string_list.begin(); iter != string_list.end(); iter++) {
        cout << iter->c_str() << endl;
    }

    auto it_test = remove_if(string_list.begin(), string_list.end(), 
        [str1, str2](string str) {
            return (str.compare(str1) == 0) || str.compare(str2) == 0;
        }
    );
    string_list.erase(it_test, string_list.end());

    for (iter = string_list.begin(); iter != string_list.end(); iter++) {
        cout << iter->c_str() << endl;
    }
}

답글 남기기