删除算法
删除算法指的是删除容器中满足相应条件的元素。
1. 被删除元素会按顺序向前移动
2. 不能应用于关联式容器
3. 关联式容器的删除需要使用算法erase()
4. list容器,可以使用自身成员函数remove()
1.remove()
直接删除容器的元素
函数原型为:
template<class ForwardIt, class T>
ForwardIt remove(ForwardIt first, ForwardIt last,
const T& value)
{
ForwardIt result = first;
for (; first != last; ++first) {
if (!(*first == value)) {//删除值为value的元素
*result++ = *first;
}
}
return result;
}
2.remove_if()
条件删除算法。
函数原型;
template<class ForwardIt, class UnaryPredicate>
ForwardIt remove_if(ForwardIt first, ForwardIt last,
UnaryPredicate p)
{
ForwardIt result = first;
for (; first != last; ++first) {
if (!p(*first)) {
*result++ = *first;
}
}
return result;
}
说明:
1. 使用的是一元判断 p
3.remove_copy 和remove_copy_if
函数用于复制过程中删除元素。
函数原型为:
//版本一
template<class InputIt, class OutputIt, class T>
OutputIt remove_copy(InputIt first, InputIt last,
OutputIt d_first, const T& value)
{
for (; first != last; ++first) {
if (!(*first == value)) {
*d_first++ = *first;
}
}
return d_first;
}
//版本二
template<class InputIt, class OutputIt, class UnaryPredicate>
OutputIt remove_copy_if(InputIt first, InputIt last,
OutputIt d_first, UnaryPredicate p)
{
for (; first != last; ++first) {
if (!p(*first)) {
*d_first++ = *first;
}
}
return d_first;
}
说明:
1. 将[first,last)复制到目标区间
2. 形式一: 不复制值等于value的元素
3. 形式二: 不复制是判断式p为真的元素
4. 返回目标区间的最后一个元素的后一个位置
4. 移除重复元素
在vector,list ,deque, multiset,multimap容器中允许重复的元素。删除是可以使用算法:
- unique()
函数原型:
//版本一
template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last)
{
if (first == last)//为空
return last;
ForwardIt result = first;
while (++first != last) {
if (!(*result == *first)) {//将后面的值把前面重复的值覆盖
*(++result) = *first;
}
}
return ++result;
}
//版本二
template<class ForwardIt, class BinaryPredicate>
ForwardIt unique(ForwardIt first, ForwardIt last,
BinaryPredicate p)
{
if (first == last)
return last;
ForwardIt result = first;
while (++first != last) {
if (!p(*result, *first)) {
*(++result) = *first;
}
}
return ++result;
}
说明:
1. 的第一个版本使用operator==比较的元素,
2. 第二个版本使用给定的二元谓词p.
3. 返回唯一元素序列的最后一个元素的后一个位置。
5. 赋值过程中删除重复元素
- unique_copy
函数原型:
//版本一
template<class ForwardIt, class OutputIt>
ForwardIt unique_copy(ForwardIt first, ForwardIt last,
OutputIt d_first)
{
if (first == last)
return d_first;
*d_first = *first;
while (++first != last) {
if (!(*d_first == *first)) {
*(++d_first) = *first;
}
}
return ++d_first;
}
//版本二
template<class ForwardIt, class OutputIt, class BinaryPredicate>
ForwardIt unique_copy(ForwardIt first, ForwardIt last,
OutputIt d_first, BinaryPredicate p)
{
if (first == last)
return d_first;
*d_first = *first;
while (++first != last) {
if (!p(*result, *first)) {
*(++d_first) = *first;
}
}
return ++d_first;
}
说明:
1. 的第一个版本使用operator==比较的元素,
2. 第二个版本使用给定的二元谓词p.
3. 返回目标区间的最后一个元素的后一个位置。