📅  最后修改于: 2023-12-03 15:23:22.453000             🧑  作者: Mango
在 C++ STL 中,有多种复制容器中元素的方法,其中包括 std::copy()
、std::copy_n()
、std::copy_if()
和 std::copy_backward()
。下面将逐一介绍这些方法。
std::copy()
是最基本的复制容器元素的方法,它的原型如下:
template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last, OutputIt d_first);
其中,first
和 last
分别是指定原始容器的起始和结束迭代器,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()
不同,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()
可以按照指定条件复制元素。它的原型如下:
template<class InputIt, class OutputIt, class UnaryPredicate>
OutputIt copy_if(InputIt first, InputIt last, OutputIt d_first, UnaryPredicate pred);
其中,first
和 last
分别是指定原始容器的起始和结束迭代器,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()
不同, std::copy_backward()
可以在两个迭代器范围重叠时正确复制元素。它的原型如下:
template<class BidirIt1, class BidirIt2>
BidirIt2 copy_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last);
其中,first
和 last
分别是指定原始容器的起始和结束迭代器(从后往前遍历),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()
仍然可以正确地复制元素。