📜  在C++ STL中复制的不同方法std :: copy(),copy_n(),copy_if(),copy_backward()(1)

📅  最后修改于: 2023-12-03 15:23:22.453000             🧑  作者: Mango

C++ STL 中的复制方法

在 C++ STL 中,有多种复制容器中元素的方法,其中包括 std::copy()std::copy_n()std::copy_if()std::copy_backward()。下面将逐一介绍这些方法。

std::copy()

std::copy() 是最基本的复制容器元素的方法,它的原型如下:

template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last, OutputIt d_first);

其中,firstlast 分别是指定原始容器的起始和结束迭代器,d_first 是指定目标容器的起始迭代器。std::copy() 会将 [first, last) 区间内的元素复制到 [d_first, d_first + (last - first)) 区间内。

例如,我们可以使用 std::copy() 将一个 std::vector 容器中的元素复制到另一个 std::vector 容器中:

#include <iostream>
#include <vector>
#include <algorithm>

int main() 
{
    std::vector<int> v1 = {1, 2, 3, 4, 5};
    std::vector<int> v2(5);

    std::copy(v1.begin(), v1.end(), v2.begin());

    for(auto i : v2)
    {
        std::cout << i << " ";
    }

    return 0;
}

输出:

1 2 3 4 5
std::copy_n()

std::copy() 不同,std::copy_n() 只复制指定数量的元素。它的原型如下:

template<class InputIt, class Size, class OutputIt>
OutputIt copy_n(InputIt first, Size count, OutputIt result);

其中,first 是指定原始容器的起始迭代器,count 指定需要复制的元素数量,result 是指定目标容器的起始迭代器。std::copy_n() 会将 [first, first + count) 区间内的元素复制到 [result, result + count) 区间内。

例如,我们可以使用 std::copy_n() 将一个 std::vector 容器中的前三个元素复制到另一个 std::vector 容器中:

#include <iostream>
#include <vector>
#include <algorithm>

int main() 
{
    std::vector<int> v1 = {1, 2, 3, 4, 5};
    std::vector<int> v2(3);

    std::copy_n(v1.begin(), 3, v2.begin());

    for(auto i : v2)
    {
        std::cout << i << " ";
    }

    return 0;
}

输出:

1 2 3
std::copy_if()

std::copy_if() 可以按照指定条件复制元素。它的原型如下:

template<class InputIt, class OutputIt, class UnaryPredicate>
OutputIt copy_if(InputIt first, InputIt last, OutputIt d_first, UnaryPredicate pred);

其中,firstlast 分别是指定原始容器的起始和结束迭代器,d_first 是指定目标容器的起始迭代器,pred 是指定的条件函数。std::copy_if() 会将 [first, last) 区间内符合条件 pred(*it) 的元素复制到 [d_first, d_last) 区间内。

例如,我们可以使用 std::copy_if() 将一个 std::vector 容器中的奇数元素复制到另一个 std::vector 容器中:

#include <iostream>
#include <vector>
#include <algorithm>

int main() 
{
    std::vector<int> v1 = {1, 2, 3, 4, 5};
    std::vector<int> v2;

    std::copy_if(v1.begin(), v1.end(), std::back_inserter(v2), [](int i){return i%2==1;});

    for(auto i : v2)
    {
        std::cout << i << " ";
    }

    return 0;
}

输出:

1 3 5

在上述示例代码中,我们使用了 std::back_inserter() 函数,它可以将元素插入到目标容器的末尾。

std::copy_backward()

std::copy() 不同, std::copy_backward() 可以在两个迭代器范围重叠时正确复制元素。它的原型如下:

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

其中,firstlast 分别是指定原始容器的起始和结束迭代器(从后往前遍历),d_last 是指定目标容器的结束迭代器(从后往前遍历)。std::copy_backward() 会将 [first, last) 区间内的元素复制到 [d_last - (last - first), d_last) 区间内,它可以正确处理两个迭代器范围重叠的情况。

例如,我们可以使用 std::copy_backward() 将一个 std::vector 容器中的元素复制到另一个 std::vector 容器中,并在两个容器范围重叠的情况下测试:

#include <iostream>
#include <vector>
#include <algorithm>

int main() 
{
    std::vector<int> v1 = {1, 2, 3, 4, 5};
    std::vector<int> v2(5);

    std::copy_backward(v1.begin(), v1.end(), v2.end());

    for(auto i : v2)
    {
        std::cout << i << " ";
    }

    return 0;
}

输出:

0 0 1 2 3

在上述示例代码中,我们可以看到,当两个容器范围重叠时,std::copy_backward() 仍然可以正确地复制元素。

参考资料