STL库中copy的使用

本文最后更新于:2022年6月8日 晚上

标准

https://en.cppreference.com/w/cpp/algorithm/copy

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <vector>
#include <string>

// 打印 std::vector 类型
template <class T>
void print(T &vecs) {
std::cout << "vecs->size:"<<vecs.size() << "\t data:";
for(auto& v : vecs)
std::cout << v << " ";
std::cout << std::endl;
}

int main () {
std::vector<char> vecs{'A','B','C','D','E','F','G','H','I'};
std::vector<char> tmp;

tmp.resize(vecs.size() * 10);
print<std::vector<char>>(vecs);
std::copy(vecs.begin(),vecs.end(),tmp.begin());
std::copy(vecs.begin(),vecs.end(),tmp.begin() + vecs.size());
std::copy(vecs.begin(),vecs.end(),tmp.begin() + vecs.size() + 1);
print<std::vector<char>>(tmp);

int64_t valA = 0x123456789;
std::vector<uint8_t> tmpA;
tmpA.resize(sizeof(valA));
std::copy((uint8_t *)&valA, (uint8_t *)&valA + sizeof(valA), tmpA.begin());
print(tmpA);
for(auto v: tmpA)
printf("%x ",v);
std::cout << std::endl;
return 0;
}
1
2
3
4
5
6
7
8
9
10
# 将上述代码保存为test.cpp ,使用以下命令编译、执行
g++ test.cpp -std=c++11
./a.out

# 得到结果,与预期一致
u@ubuntu:~$ ./a.out
vecs->size:9 data:A B C D E F G H I
vecs->size:90 data:A B C D E F G H I A A B C D E F G H I
vecs->size:8 data:� g E #
89 67 45 23 1 0 0 0

总结

在使用过程中 copy 有三个参数,分别是待拷贝的数据开始迭代器、待拷贝的数据的结束迭代器、目的迭代器

其中如果要拷贝非STL中数据,根据目的迭代器的存储类型,将源数据 转成对应的指针形式访问内存,比如上述代码中的

std::copy((uint8_t *)&valA, (uint8_t *)&valA + sizeof(valA), tmpA.begin());


STL库中copy的使用
https://www.glj0.top/posts/8299be4a/
作者
gong lj
发布于
2022年3月10日
更新于
2022年6月8日
许可协议