c++标准模板(STL)- 算法 (std::move_backward)

定义于头文件 

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last) ,其中 last 指代要查询或修改的最后元素的后一个元素。

按从后往前的顺序复制一个范围内的元素

std::move_backward

template< class BidirIt1, class BidirIt2 >
BidirIt2 move_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );

(C++11 起)
(C++20 前)

template< class BidirIt1, class BidirIt2 >
constexpr BidirIt2 move_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );

(C++20 起)

 移动来自范围 [first, last) 的元素到终于 d_last 的另一范围。以逆序移动元素(首先复制末元素),但保持其相对顺序。

d_last(first, last] 内则行为未定义。该情况下必须用 std::move 代替 std::move_backward

参数

first, last - 要移动的元素范围
d_last - 目标范围结尾
类型要求
- BidirIt1, BidirIt2 必须满足遗留双向迭代器 (LegacyBidirectionalIterator) 的要求。

返回值

目标范围中的迭代器,指向最后移动的元素。

复杂度

准确移动赋值 last - first 次。

可能的实现

template< class BidirIt1, class BidirIt2 >
BidirIt2 move_backward(BidirIt1 first,
                                     BidirIt1 last,
                                     BidirIt2 d_last)
{
    while (first != last) {
        *(--d_last) = std::move(*(--last));
    }
    return d_last;
}

注意

移动重叠的范围时, std::move 在移动到左侧(目标范围的起始在源范围外)时适合,而 std::move_backward 在移动到右侧(目标范围的结尾在源范围外)时适合。

调用示例

#include 
#include 
#include 
#include 

int main()
{
    std::vector src{"foo", "bar", "baz"};
    std::vector dest(src.size());

    std::cout << "src: ";
    for (const auto &s : src)
    {
        std::cout << s << ' ';
    }
    std::cout << "\ndest: ";
    for (const auto &s : dest)
    {
        std::cout << s << ' ';
    }
    std::cout << '\n';

    std::move_backward(src.begin(), src.end(), dest.end());

    std::cout << "src: ";
    for (const auto &s : src)
    {
        std::cout << s << ' ';
    }
    std::cout << "\ndest: ";
    for (const auto &s : dest)
    {
        std::cout << s << ' ';
    }
    std::cout << '\n';
}

输出

c++标准模板(STL)- 算法 (std::move_backward)_第1张图片

 

你可能感兴趣的:(#,修改序列的操作,c++,算法,move_backward)