std::
remove
函数模板 <algorithm>
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val); |
覆盖范围中的值
[注:这是算法的 remove 的参考。关于<cstdio>的remove,请参阅remove。]
改变范围[first,last),"删除"与val相等的所有元素,并返回一个指向该范围新端点的迭代器。
这个函数不能改变包含元素范围的对象的属性(也就是说,它不能改变数组或容器的大小).
这个函数并不能真正删除元素,
"删除"的方法是: 将compare值等于val的元素替换为下一个不等于val的元素,
并通过返回一个迭代器来标识缩短的范围的新大小。
这个迭代器指向认定的末尾元素(最后一个不等于val的元素)的下一个元素.
这个函数保留未"删除"元素的相对顺序,而返回的迭代器和last之间的元素保持有效但未指定的状态。
该函数使用operator==将单个元素与val进行比较。
这个函数模板的行为相当于:
-
C++98
-
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator result = first;
while (first!=last) {
if (!(*first == val)) {
if (result!=first)
*result = *first;
++result;
}
++first;
}
return result;
} |
-
C++11
-
元素通过移动分配他们的新值.
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator result = first;
while (first!=last) {
if (!(*first == val)) {
if (result!=first)
*result = move(*first);
++result;
}
++first;
}
return result;
} |
☲ 参数
-
first, last
-
指向一个支持与T类型值比较的可移动赋值序列的初始和最终位置的前向迭代器。
使用的范围是[first,last),
它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
-
val
-
覆盖的值。
☉ 返回值
指向最后一个未被删除元素后面的元素的迭代器。
first和this迭代器之间的范围包括序列中与val比较不相等的所有元素。
☣ 示例
// remove algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::remove
int main () {
int myints[] = {10,20,30,30,20,10,10,20}; // 10 20 30 30 20 10 10 20
// bounds of range:
int* pbegin = myints; // ^
int* pend = myints+sizeof(myints)/sizeof(int); // ^ ^
pend = std::remove (pbegin, pend, 20); // 10 30 30 10 10 ? ? ?
// ^ ^
std::cout << "range contains:";
for (int* p=pbegin; p!=pend; ++p)
std::cout << ' ' << *p;
std::cout << '\n';
return 0;
} |
输出:
range contains: 10 30 30 10 10
✥ 复杂度
first1和last1之间的线性距离:比较每个元素,并可能对其中一些元素执行赋值。
⇄ 数据竞争
范围[first,last)中的对象将被访问并可能被修改。
☂ 异常安全性
如果元素比较、元素赋值或迭代器上的任何操作抛出,则抛出。
注意,无效的参数会导致未定义的行为。
🍄 另请参阅
remove_if |
检查并覆盖范围中的值(函数模板) |
remove_copy |
复制范围内部分值(函数模板) |
replace |
替换范围内的值(函数模板) |
count |
返回范围内某个元素的数量(函数模板) |
find |
在范围内查找值(函数模板) |