📅  最后修改于: 2023-12-03 14:59:37.107000             🧑  作者: Mango
在C++中,STL提供了许多方便的函数和算法来处理容器中的元素。其中,std::remove和std::remove_if是两个用于删除容器中指定元素的函数。
template <class ForwardIt, class T>
ForwardIt remove(ForwardIt first, ForwardIt last, const T& value);
该函数的作用是将[first,last)区间内的值为value的元素移动到区间的末尾,并返回指向新区间结尾的迭代器。
例如:
std::vector<int> v = {1, 2, 3, 2, 4, 5};
auto last = std::remove(v.begin(), v.end(), 2);
// v = {1, 3, 4, 5, 4, 5}
// last指向新区间的结尾,即{1, 3, 4, 5}的end()
template <class ForwardIt, class UnaryPredicate>
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p);
该函数与std::remove类似,不同之处在于,它接受一个谓词(UnaryPredicate)作为第三个参数,用于指定哪些元素应该被删除。
例如:
std::vector<int> v = {1, 2, 3, 2, 4, 5};
auto last = std::remove_if(v.begin(), v.end(), [](int i) { return i % 2 == 0; });
// v = {1, 3, 5, 2, 4, 5}
// last指向新区间的结尾,即{1, 3, 5}的end()
这两个函数并没有真正删除容器中的元素,而是将需要删除的元素移动到了容器的末尾,返回了指向新区间的结尾的迭代器。如果要真正删除元素,需要调用容器的erase函数,如:
v.erase(last, v.end());
此外,这两个函数只是移动元素,并没有改变容器的大小,如果需要改变容器大小,需要调用容器的resize函数,如:
v.resize(std::distance(v.begin(), last));