std::
move_backward
函数模板 <algorithm>
template <class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 move_backward (BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 result); |
从末尾移动范围的元素
将范围 [first,last)中的元素从末尾开始移动到以result结束的范围中。
该函数返回目标范围内第一个元素的迭代器。
结果范围中的元素的顺序与 [first,last)完全相同。要颠倒它们的顺序,请参见reverse。
函数首先将*(last-1)移动到*(result-1),
然后再向前移动这些元素之前的元素,直到到达first(包括它)。
范围不应这样重叠,即result (即目标范围中的past-the-end元素)
指向范围(first,last]中的一个元素。有关此类情况,请参见move。
这个函数模板的行为相当于:
template<class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 move_backward ( BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 result )
{
while (last!=first) *(--result) = std::move(*(--last));
return result;
} |
☲ 参数
-
first, last
-
指向一个将要移动的序列初始和最终位置的双向迭代器。使用的范围是[first,last),
它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
-
result
-
指向目标序列中的结束后位置的双向迭代器。
这将不会指向范围 [first,last)中的任何元素。
☉ 返回值
指向目标序列中已移动元素的第一个元素的迭代器。
☣ 示例
// move_backward example
#include <iostream> // std::cout
#include <algorithm> // std::move_backward
#include <string> // std::string
int main () {
std::string elems[10] = {"air","water","fire","earth"};
// insert new element at the beginning:
std::move_backward (elems,elems+4,elems+5);
elems[0]="ether";
std::cout << "elems contains:";
for (int i=0; i<10; ++i)
std::cout << " [" << elems[i] << "]";
std::cout << '\n';
return 0;
} |
输出:
elems contains: [ether] [air] [water] [fire] [earth] [] [] [] [] []
✥ 复杂度
first and last之间的距离是线性的:对范围内的每个元素执行移动赋值。
⇄ 数据竞争
修改两个范围内的对象。
☂ 异常安全性
如果元素move-赋值(assignment)或迭代器上的操作抛出,则抛出。
注意,无效的参数会导致未定义的行为。
🍄 另请参阅
move |
移动范围的元素(函数模板) |
copy_backward |
从末尾复制范围的元素(函数模板) |