在符合标准的STL实现中,哪种或哪种STL算法可以安全使用?
换句话说:标准要求哪种或哪种STL算法是单通的?
如果详尽的清单太长,那么识别那些安全的方法也是可以的。
答案 0 :(得分:16)
对InputIterator
和OutputIterator
进行操作的算法可能只需通过一次通过它们操作的范围即可。
来自cppreference 1 :
InputIterator是一个可以从指向元素读取的迭代器。 InputIterators仅保证单通道算法的有效性:一旦InputIterator i递增,其先前值的所有副本都可能无效。
通过输出迭代器的相同值进行赋值只发生一次:输出迭代器上的算法必须是单遍算法。
这是包含InputIterator
和OutputIterator
参数的算法列表:
all_of, any_of and none_of
for_each
count and count_if
mismatch
equal
find, find_if and find_if_not
find_first_of
为第一个迭代器对提供InputIterator
行为copy and copy_if
copy_n
move
fill_n
transform
generate_n
remove_copy and remove_copy_if
replace_copy and replace_copy_if
unique_copy
is_partitioned
partition_copy
partial_sort_copy
,为第一个迭代器对提供InputIterator
行为merge
includes
set_difference
set_intersection
set_symmetric_difference
set_union
lexicographical_compare
accumulate
inner_product
adjacent_difference
partial_sum
在C ++ 17中添加:
for_each_n
sample
输入或输出迭代器可以是单遍,但不是两者 - 输入必须满足ForwardIterator
或输出必须满足RandomAccessIterator
。exclusive_scan
inclusive_scan
transform_reduce
transform_exclusive_scan
transform_inclusive_scan
uninitialized_move
uninitialized_move_n
有趣的是,此列表中有三个算法不,人们可能会期望:max_element
,min_element
和minmax_element
是查找最大值的标准算法,最小值以及范围的最小值和最大值。人们可能希望它们只在一个时间内迭代它们给定的范围,因此需要InputIterator
个参数。相反,它们需要ForwardIterator
个参数,因为它们不是返回所选元素的值,而是返回一个迭代器。由于这违反了InputIterator的单次传递要求,因此这些算法自然会留下ForwardIterator
。
1。标准(n4140草案)对两个计数都支持cppreference。
§24.2.3[input.iterators]指出在++r
之后r
是输入迭代器,“不再需要r的先前值的任何副本可解除引用或属于==“
*r = o
和*r++ = o
的§24.2.4[output.iterators]状态“在此操作之后,r不需要是可解除引用的。” 功能
这两个部分都包含一些注释,提到有问题的迭代器对于单遍范围是安全的,声明“算法on(输入|输出)迭代器不应该尝试两次通过同一个迭代器。它们应该是单个的通过算法。“当然,笔记没有约束力。