[정보]
C++20 vector에서 원소 쉽게 지우기
익명(skuld88)
2022-07-19 15:35
추천 5
이 글은 C++ 마이너 갤러리에서 쓰여진 글입니다. C++ 유저들 컴컴!
https://gall.dcinside.com/mgallery/board/view/?id=cplpl&no=14&page=1
갤 초기니까 가벼운 주제로 써 보겠습니다.
C++17 까지는 vector 에서 특정 원소가 여러 번 등장하는데 이걸 전부 지우고 싶을 때
매우 귀찮은 코드를 써야 했습니다.
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std
;
void print(const vector
<int>& v
) {
for (auto n
: v
) {
cout
<< n
<< ' ';
}
cout
<< 'n';
}
int main() {
vector
<int> v
{1, 2, 3, 3, 5, 3, 6, 7, 3, 8};
print(v
);
v
.erase(remove(v
.begin(), v
.end(), 3), v
.end());
print(v
);
}
remove-erase idiom이라고 하는데 아무래도 븅신 같습니다.
remove 라는 함수명을 보면 왠지 지우는 것까지 완료해 줘야 할것 같잖아요. 처음 보는 사람한테는 혼란스럽죠.
이로 인해 C++20 부터는 std::erase 한방으로 훨씬 더 직관적으로 지울 수 있게 되었습니다.
단, v.erase()가 아니라, std::erase(v, 3)이 됩니다.
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std
;
void print(const vector
<int>& v
) {
for (auto n
: v
) {
cout
<< n
<< ' ';
}
cout
<< 'n';
}
int main() {
vector
<int> v
{1, 2, 3, 3, 5, 3, 6, 7, 3, 8};
print(v
);
erase(v
, 3); // C++20
print(v
);
}
실행 결과: https://wandbox.org/permlink/BIZYv4FkoscPrnZL
이제 깔끔하게 std::erase(v, elem);으로 지우세요!
하지만 회사에서 20을 안 씀.. ㅠㅠ - dc App
std::erase도 좀 ㅂㅅ같은데 걍 v.erase를 바꾸는건 하위호환성때문에 무리이려나
큰 상관은 없는데 보통 알려진 이름은 erase-remove긴함요
https://en.m.wikipedia.org/wiki/Erase%E2%80%93remove_idiom
맘에 안드네 filter 없냐
erase_if도 똑같이 됩니다