从char*高效地实例化vector <char>

yto*_*ano 1 c++ stl vector

我的代码中有一个热点,我需要调用一个带有a的库函数,vector<char> vec我将数据作为char* data一个size_t len长度.我目前这样做:

vec.reserve(len);
std::copy(data, data+len, back_inserter(vec));
Run Code Online (Sandbox Code Playgroud)

就像我说这是一个热点.我想知道一次复制一个字节是否太慢,并且在每次迭代中复制4或8个字节会更快.我也没有意识到有一种方法可以用这种方式填充向量(因为它需要写入其data()成员).

有没有办法可以完全避免副本?

Ant*_*vin 8

你可以这样做

vec.assign(data, data + len);
Run Code Online (Sandbox Code Playgroud)

或者,如果它是一个新变量,请使用适当的构造函数:

std::vector<char> vec(data, data + len);
Run Code Online (Sandbox Code Playgroud)

它应该比push_back()逐个更有效(虽然配置它),但无论如何它是一个副本.

除非您vector<char>从一开始就使用数据或更改库代码,否则无法避免复制.

至少,您可以vec在对库的调用之间重用(通过调用assign),这样可以节省一些内存分配时间.