我的类动态分配一个整数数组(在下面的代码中命名为this_data
),但该数组只能填充到最大长度(this_data_maxlen
)。我想将数据(add_data
)添加到数组中,但添加数组可能超过最大长度。
知道new
个关键字没有重新分配,我写了一个使用memcpy
的版本和另一个使用vector
的版本,因为这被认为是最有效的方式。但是,在测试时,vector
版本比memcpy
慢5倍。我在vector
版本中做错了吗?
Memcpy版本:
unsigned int this_data_len=50;
unsigned int this_data_maxlen=70; //maximum length of existing dataset
unsigned int add_data_len=50;
int *this_data = new int[this_data_len]; //existing dataset
int *add_data = new int[add_data_len]; //data we want to add to existing dataset
//function here that puts values in them
unsigned int new_data_len=min(this_data_maxlen,this_data_len+add_data_len); //calculate the new dataset length (=7)
int *new_data=new int[new_data_len]; //create the new dataset
//build the new 'this_data'
memcpy(new_data,this_data,this_data_len*sizeof(int)); //copy existing dataset values to new dataset
memcpy(new_data+this_data_len,add_data,(this_data_maxlen-this_data_len)*sizeof(int)); //fill up the new dataset with a selection of the data to add
delete [] this_data; //remove original dataset
this_data=new_data; //set the new dataset
//build the new 'add_data'
add_data_len=add_data_len-(this_data_maxlen-this_data_len); //update the add_data length (=2)
new_data=new int[add_data_len];
memcpy(new_data,add_data+(this_data_maxlen-this_data_len),add_data_len*sizeof(int));
delete [] add_data;
add_data=new_data;
this_data_len=new_data_len; //set the new dataset length
//clean up
delete [] this_data;
delete [] add_data;
矢量版:
unsigned int this_data_len=50;
unsigned int this_data_maxlen=70; //maximum length of existing dataset
unsigned int add_data_len=50;
vector<int> this_vector(this_data_len);
vector<int> add_vector(add_data_len);
//function here that puts values in them
unsigned int new_data_len=min(this_data_maxlen,this_data_len+add_data_len); //calculate the new dataset length (=7)
this_vector.reserve(new_data_len);
this_vector.insert(this_vector.end(),add_vector.begin(),add_vector.begin()+(this_data_maxlen-this_data_len));
add_vector=vector<int>(add_vector.begin()+(this_data_maxlen-this_data_len),add_vector.end());
add_data_len=add_data_len-(this_data_maxlen-this_data_len); //update the add_data length (=2)
this_data_len=new_data_len; //set the new dataset length
答案 0 :(得分:0)
您的测试似乎不相同。特别是,这条线可能比你想做的工作多得多:
add_vector = vector<int>(add_vector.begin() + (this_data_maxlen - this_data_len),
add_vector.end());
这条线至少可以创建一个临时矢量,删除原始矢量的内容,并可能在删除之前将临时矢量的内容复制到原始矢量中。 (使用RVO,或者使用C ++ 11的移动语义,可以避免其中一些。)
这一切都是为了实现
的效果add_vector.erase(add_vector.begin(),
add_vector.begin() + (this_data_maxlen - this_data_len));
作为另一条评论,如果您始终在最后添加数据并从头开始删除数据,那么最好使用std::queue
或std::deque
代替std::vector
。
(在我写完这篇文章之后,我看到borisbn和C.R.已经提供了关于在我之前使用vector :: erase小时的信息。向你们两人致敬。)