std::experimental::ranges::equal
定义在头文件 <experimental/ranges/algorithm> 中 |
||
template< InputIterator I1, Sentinel<I1> S1, InputIterator I2, Sentinel<I2> S2, class Pred = ranges::equal_to<>, |
(1) | (范围 TS) |
template< InputRange R1, InputRange R2, class Pred = ranges::equal_to<>, class Proj1 = ranges::identity, class Proj2 = ranges::identity > |
(2) | (范围 TS) |
template< InputIterator I1, Sentinel<I1> S1, class I2, class Pred = ranges::equal_to<>, |
(3) | (范围 TS) (已弃用) |
template< InputRange R1, class I2, class Pred = ranges::equal_to<>, class Proj1 = ranges::identity, class Proj2 = ranges::identity > |
(4) | (范围 TS) (已弃用) |
[
first1,
last1)
等于范围 [
first2,
last2)
,则返回 true,否则返回 false。如果两个范围具有相同数量的元素,并且对于范围 `[`first1,
last1)
中的每个迭代器 `i`,ranges::invoke(pred, ranges::invoke(proj1, *i), ranges::invoke(proj2, *(first2 + (i - first1)))) 为 true,则它们被认为是相等的。
尽管有上述声明,算法声明的模板参数的实际数量和顺序是未指定的。因此,如果在调用算法时使用显式模板参数,则程序可能不具有可移植性。
内容 |
[编辑] 参数
first1, last1 | - | 元素的第一个范围 |
r1 | - | 元素的第一个范围 |
first2, last2 | - | 元素的第二个范围 |
r2 | - | 元素的第二个范围 |
first2_ | - | 元素的第二个范围的开始 |
pred | - | 要应用于投影元素的谓词 |
proj1 | - | 要应用于第一个范围中元素的投影 |
proj2 | - | 要应用于第二个范围中元素的投影 |
[编辑] 返回值
如果两个范围相等,则返回 true,否则返回 false。
[编辑] 注释
ranges::equal
不应用于比较由来自 std::unordered_set、std::unordered_multiset、std::unordered_map 或 std::unordered_multimap 的迭代器形成的范围,因为即使两个容器存储相同的元素,元素存储的顺序也可能不同。
在比较整个容器是否相等时,通常首选对应容器的 `operator==`。
[编辑] 复杂度
[编辑] 可能的实现
namespace detail { template<InputIterator I1, SizedSentinel<I1> S1, InputIterator I2, SizedSentinel<I1> S2> bool check_size(I1& first1, S1& last1, I2& first2, S2& last2) { return last1 - first1 != last2 - first2; } template<InputIterator I1, Sentinel<I1> S1, InputIterator I2, Sentinel<I1> S2> bool check_size(I1& first1, S1& last1, I2& first2, S2& last2) { return false; } } template<InputIterator I1, Sentinel<I1> S1, InputIterator I2, Sentinel<I2> S2, class Pred = ranges::equal_to<>, class Proj1 = ranges::identity, class Proj2 = ranges::identity> requires IndirectlyComparable<I1, I2, Pred, Proj1, Proj2> bool equal(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = Pred{}, Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{}) { if (detail::check_size(first1, last1, first2, last2)) return false; for (; first1 != last1 && first2 != last2; (void) ++first1, (void)++first2) if (!ranges::invoke(pred, ranges::invoke(proj1, *first1), ranges::invoke(proj2, *first2))) return false; return first1 == last1 && first2 == last2; } |
[编辑] 示例
本节尚未完善 原因:没有示例 |
[编辑] 另请参阅
确定两组元素是否相同 (函数模板) | |
查找第一个满足特定条件的元素 (函数模板) | |
如果一个范围在词典上小于另一个范围,则返回 true (函数模板) | |
查找两个范围不同的第一个位置 (函数模板) | |
搜索一系列元素 (函数模板) |