【翻译】std::remove – C++ Reference

函数模板

std::remove头文件

template <class ForwardIterator, class T>
  ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);

从一个范围中删除某值

[注释:本文是 std::remove 算法的参考手册,关于 头文件下的 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/

原文链接: https://www.cnblogs.com/fengyubo/p/5050880.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/225954

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午12:59
下一篇 2023年2月13日 下午1:00

相关推荐