std::ranges::shift_left, std::ranges::shift_right
来自cppreference.com
在标头 <algorithm> 定义
|
||
调用签名 |
||
template< std::permutable I, std::sentinel_for<I> S > constexpr ranges::subrange<I> |
(1) | (C++23 起) |
template< ranges::forward_range R > requires std::permutable<ranges::iterator_t<R>> |
(2) | (C++23 起) |
template< std::permutable I, std::sentinel_for<I> S > constexpr ranges::subrange<I> |
(3) | (C++23 起) |
template< ranges::forward_range R > requires std::permutable<ranges::iterator_t<R>> |
(4) | (C++23 起) |
将范围 [
first,
last)
或 r 中的各元素迁移 n
个位置。若 [
first,
last)
不是有效范围则其行为未定义。
1) 向范围开端迁移元素:
- 若 n == 0 || n >= last - first 则无效果。
- 若 n < 0 则行为未定义。
- 否则,对于每个
[
0,
last - first - n)
中的整数i
,移动原处于位置 first + n + i 的元素到位置 first + i。以i
从 0 开始递增的顺序进行移动。
3) 向范围结尾迁移元素:
- 若 n == 0 || n >= last - first 则无效果。
- 若 n < 0 则行为未定义。
- 否则,对于每个
[
0,
last - first - n)
中的整数i
,移动原处于位置 first + i 的元素到位置 first + n + i。若I
满足bidirectional_iterator
,则以i
从 last - first - n - 1 开始递减的顺序进行移动。
在原范围但不在新范围中的元素被置于合法但未指定的状态。
此页面上描述的函数式实体是算法函数对象(非正式地称为 niebloid),即:
目录 |
[编辑] 参数
first, last | - | 要迁移的元素范围的迭代器-哨位对 |
r | - | 要迁移的元素范围 |
n | - | 要迁移的位置数 |
[编辑] 返回值
1,2) {first, /*NEW_LAST*/},其中
NEW_LAST
为结果范围的结尾:
- 若
n
小于 last - first,则等价于 first + (last - first - n); - 否则等价于 first。
3,4) {/*NEW_FIRST*/, last},其中
NEW_FIRST
为结果范围的开始:
- 若
n
小于 last - first,则等价于 first + n; - 否则等价于 last。
[编辑] 复杂度
1,2) 最多赋值 ranges::distance(first, last) - n 次。
3,4) 最多赋值或交换 ranges::distance(first, last) - n 次。
[编辑] 注解
常见实现上,若 I
满足 bidirectional_iterator
或(更好地)random_access_iterator
,则 ranges::shift_left
/ ranges::shift_right
会有更好的性能。
实现(例如 MSVC STL )可能在迭代器类型实现 contiguous_iterator
,并且交换其值类型不调用非平凡的特殊成员函数或 ADL 所找到的 swap
时启用向量化。
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|