std::execution::sequenced_policy, std::execution::parallel_policy, std::execution::parallel_unsequenced_policy, std::execution::unsequenced_policy
有制约算法 (C++20 起)
std::is_execution_policy
std::execution::seq, std::execution::par, std::execution::par_unseq, std::execution::unseq
std::all_of, std::any_of, std::none_of
std::for_each_n
std::sort
std::reduce
std::inclusive_scan
std::exclusive_scan
std::random_shuffle, std::shuffle
std::clamp
std::equal
std::is_permutation
std::mismatch
std::swap
std::search
std::transform
std::for_each
std::make_heap
std::count, std::count_if
std::adjacent_find
std::find, std::find_if, std::find_if_not
std::find_end
std::find_first_of
std::search_n
std::lexicographical_compare
std::lexicographical_compare_three_way
std::copy, std::copy_if
std::copy_n
std::copy_backward
std::move
std::move_backward
std::shift_left, std::shift_right
std::fill
std::fill_n
std::generate
std::generate_n
std::iter_swap
std::swap_ranges
std::sample
std::remove, std::remove_if
std::replace, std::replace_if
std::reverse
std::rotate
std::unique
std::remove_copy, std::remove_copy_if
std::replace_copy, std::replace_copy_if
std::reverse_copy
std::rotate_copy
std::unique_copy
std::is_partitioned
std::partition_point
std::partition
std::partition_copy
std::stable_partition
std::is_sorted
std::is_sorted_until
std::stable_sort
std::partial_sort
std::partial_sort_copy
std::nth_element
std::lower_bound
std::upper_bound
std::binary_search
std::equal_range
std::merge
std::inplace_merge
std::set_difference
std::set_intersection
std::set_symmetric_difference
std::set_union
std::includes
std::is_heap
std::is_heap_until
std::sort_heap
std::push_heap
std::pop_heap
std::max
std::max_element
std::min
std::min_element
std::minmax
std::minmax_element
std::next_permutation
std::prev_permutation
std::iota
std::inner_product
std::adjacent_difference
std::accumulate
std::transform_reduce
std::partial_sum
std::transform_inclusive_scan
std::transform_exclusive_scan
std::qsort
std::bsearch
输入/输出库
文件系统库
正则表达式库
原子操作库
线程支持库
实验性 C++ 特性
有用的资源
std 符号索引
协程支持 (C++20)
C++ 关键词
template
<
class
ForwardIt,
class
T
>
ForwardIt remove
(
ForwardIt first, ForwardIt last,
const
T
&
value
)
;
(C++20 前)
template
<
class
ForwardIt,
class
T
>
constexpr
ForwardIt remove
(
ForwardIt first, ForwardIt last,
const
T
&
value
)
;
(C++20 起)
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
T
>
ForwardIt remove
(
ExecutionPolicy
&&
policy, ForwardIt first, ForwardIt last,
const
T
&
value
)
;
(C++17 起)
template
<
class
ForwardIt,
class
UnaryPredicate
>
ForwardIt remove_if
(
ForwardIt first, ForwardIt last, UnaryPredicate p
)
;
(C++20 前)
template
<
class
ForwardIt,
class
UnaryPredicate
>
constexpr
ForwardIt remove_if
(
ForwardIt first, ForwardIt last, UnaryPredicate p
)
;
(C++20 起)
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
UnaryPredicate
>
ForwardIt remove_if
(
ExecutionPolicy
&&
policy, ForwardIt first, ForwardIt last, UnaryPredicate p
)
;
(C++17 起)
从范围
[first, last)
移除所有满足特定判别标准的元素,并返回范围新结尾的尾后迭代器。
1)
移除所有等于
value
的元素。
3)
移除所有
p
对于它返回
true
的元素,用
operator
==
比较它们。
通过以满足不移除的元素出现在范围起始的方式,迁移(以移动赋值的方式)范围中的元素进行移除。保持剩余元素的相对顺序,且不更改容器的
物理
大小。指向范围的新
逻辑
结尾和
物理
结尾之间元素的迭代器仍然可解引用,但元素自身拥有未指定值(因为
可移动赋值
(MoveAssignable)
的后置条件)。调用
remove
典型地后随调用容器的
erase
方法,它擦除未指定值并减小容器的
物理
大小,以匹配其新的
逻辑
大小。
若应该移除元素则返回
true
的一元谓词。
对每个(可为 const 的)
VT
类型参数
v
,其中
VT
是
ForwardIt
的值类型,表达式
p
(
v
)
必须可转换为
bool
,无关乎
值类别
,而且必须不修改
v
。从而不允许
VT
&
类型参数
,亦不允许
VT
,除非对
VT
而言移动等价于复制
(C++11 起)
。
-
ForwardIt
必须满足
遗留向前迭代器
(LegacyForwardIterator)
的要求。
-
解引用
ForwardIt
结果的类型必须满足
可移动赋值
(MoveAssignable)
的要求。
-
UnaryPredicate
必须满足
谓词
(Predicate)
的要求。
新值范围的尾后迭代器(若它不是
end
,则它指向未指定值,而此迭代器与
end
之间的迭代器所指向的任何值亦然)。
准确应用
std::
distance
(
first, last
)
次谓词。
拥有名为
ExecutionPolicy
的模板形参的重载按下列方式报告错误:
-
若作为算法一部分调用的函数的执行抛出异常,且
ExecutionPolicy
为
标准策略
之一,则调用
std::terminate
。对于任何其他
ExecutionPolicy
,行为是实现定义的。
-
若算法无法分配内存,则抛出
std::bad_alloc
。
同名的容器成员函数
list::remove
、
list::remove_if
、
forward_list::remove
及
forward_list::remove_if
擦除被移除的元素。
这些算法不可用于关联容器,如
std::set
和
std::map
,因为 ForwardIt 不能解引用为
可移动赋值
(MoveAssignable)
类型(这些容器中的关键字不可修改)。
标准库亦定义
std::remove
接收
const char*
的重载,用于删除文件:
std::remove
。
因为
std::remove
以引用接收
value
,若引用到范围
[first, last)
中的元素,则它可能有不可预期的行为。
可能的实现
template< class ForwardIt, class T >
ForwardIt remove(ForwardIt first, ForwardIt last, const T& value)
first = std::find(first, last, value);
if (first != last)
for(ForwardIt i = first; ++i != last; )
if (!(*i == value))
*first++ = std::move(*i);
return first;
template<class ForwardIt, class UnaryPredicate>
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p)
first = std::find_if(first, last, p);
if (first != last)
for(ForwardIt i = first; ++i != last; )
if (!p(*i))
*first++ = std::move(*i);
return first;
下列代码从 string 移除所有空格,通过迁移所有非空格字符到左侧,再擦除其他内容。这是擦除移除手法的样例。
#include <algorithm>
#include <string>
#include <iostream>
#include <cctype>
int main()
std::string str1 = "Text with some spaces";
str1.erase(std::remove(str1.begin(), str1.end(), ' '),
str1.end());
std::cout << str1 << '\n';
std::string str2 = "Text\n with\tsome \t whitespaces\n\n";
str2.erase(std::remove_if(str2.begin(),
str2.end(),
[](unsigned char x){return std::isspace(x);}),
str2.end());
std::cout << str2 << '\n';
Textwithsomespaces
Textwithsomewhitespaces
复制一个范围的元素,忽略满足特定判别标准的元素
(函数模板)
移除范围内的连续重复元素
(函数模板)