几种拷贝方式对比

1.构造时直接初始化(推荐)

unsigned char* data = ...;
size_t len = ...;

std::vector<unsigned char> vec(data, data + len);

最简洁高效,一次分配 + 一次拷贝。

2.assign() 方法

std::vector<unsigned char> vec;
vec.assign(data, data + len);

3.使用 memcpy(最快)

std::vector<unsigned char> vec(len);  // 预分配
std::memcpy(vec.data(), data, len);

4.insert() 方法

std::vector<unsigned char> vec;
vec.reserve(len);  // 预分配,避免多次扩容
vec.insert(vec.end(), data, data + len);

5.std::copy

std::vector<unsigned char> vec(len);
std::copy(data, data + len, vec.begin());

性能对比
在这里插入图片描述

这里写个案例:

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

vector<unsigned char> example(100000);

int main()
{
	string h1 = "99999999";
	string h2 = "88888888";

	unsigned char* h3 = (unsigned char*)"4589234579342759324632963";

	// 向vector中拷贝内容,memcpy是比较高效的方法,但要提前分配好空间,否则会出现段错误问题
	memcpy(example.data(), (unsigned char*)h1.c_str(), h1.size());
	memcpy(example.data()+ h1.size(), (unsigned char*)h2.c_str(), h2.size());
	memcpy(example.data() + h1.size() + h2.size(), h3, strlen((char*)h3));	// 这里必须用strlen, 用sizeof返回的是指针类型的大小

	// 证明结果
	for (int i = 0; i < example.size(); i++) cout << example[i];
	cout << endl;
}

输出结果:

99999999888888884589234579342759324632963
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐