【翻译】std::remove - C++ Reference
函数模板
std::remove 头文件<algorithm>
template <class ForwardIterator, class T> ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
从一个范围中删除某值
[注释:本文是 std::remove 算法的参考手册,关于 <cstdio.h> 头文件下的 remove 函数,请参见:http://www.cplusplus.com/reference/cstdio/remove/]
对范围 [first , last ) 进行转换(transform),移除其中所有与 val 相等的元素,返回一个指向新范围的 end 的迭代器。
(译注:transform 是 STL 的一个算法,不知道 std::remove 的底层是否经由 std::transform 实现。)
函数不改变所包含的“范围对象”的属性(换句话说,函数不改变数组或者容器的真实 size ):元素被移动是通过下一个不等于 val 的元素,来替换当前等于 val 的元素,而且会通过返回一个指向新 end 的迭代器,来指示出新的稍“短”一些的范围(返回的迭代器所指向的元素是新的 past-the-end 元素)。
元素间的顺序不会改变。介于返回的迭代器和 last 迭代器间的元素仍然有效,但是状态是未定义的。
函数使用 operator== 来逐个比较元素与 val 是否相等。
C++11下或如何实现
元素的替换通过 move-assigning 一个新值来实现。
可能通过如下函数模板来实现:
1 template <class ForwardIterator, class T> 2 ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val) 3 { 4 ForwardIterator result = first; 5 while (first!=last) { 6 if (!(*first == val)) { 7 *result = move(*first); 8 ++result; 9 } 10 ++first; 11 } 12 return result; 13 }
函数形参
# first,last
指向 move-assignable 序列首部和尾部的前向迭代器,用它们来支持元素和类型为 T 的值进行比较。迭代器指向的范围是 [ first, last ),这包括了 first 和 last 之间—— first 所指向的元素和 last 之前的元素。
# val
将被移除的元素的值。
返回值
一个指向最后一个没被移除的元素的迭代器。
first 和这个迭代器的范围之间,包括了所有不等于 val 的元素。
使用示例
1 // remove algorithm example 2 #include <iostream> // std::cout 3 #include <algorithm> // std::remove 4 5 int main () { 6 int myints[] = {10,20,30,30,20,10,10,20}; // 10 20 30 30 20 10 10 20 7 8 // bounds of range: 9 int* pbegin = myints; // ^ 10 int* pend = myints+sizeof(myints)/sizeof(int); // ^ ^ 11 12 pend = std::remove (pbegin, pend, 20); // 10 30 30 10 10 ? ? ? 13 // ^ ^ 14 std::cout << "range contains:"; 15 for (int* p=pbegin; p!=pend; ++p) 16 std::cout << ' ' << *p; 17 std::cout << '\n'; 18 19 return 0; 20 }
输出:
range contains: 10 30 30 10 10
复杂度
复杂度是与 first 和 last 之间的距离(C++ STL 的函数)线性相关,即函数调用会与每一个元素进行比较,而且可能对其中的一些元素进行赋值。
数据簇
函数会访问、可能修改 [ first , last ) 范围之间的对象。
异常
元素比较(element comparisons)时可能抛出异常,元素赋值或者赋值操作作用于迭代器时,可能抛出异常。
注意,对于无效的参数会造成未定义的行为。
参阅
remove_if
remove_copy
replace
count
find
原文地址:http://www.cplusplus.com/reference/algorithm/remove/