将数组填充到最大量(memcpy vs vector)

时间:2014-05-16 02:46:08

标签: c++ arrays memory-management stdvector memcpy

我的类动态分配一个整数数组(在下面的代码中命名为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

1 个答案:

答案 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::queuestd::deque代替std::vector

(在我写完这篇文章之后,我看到borisbn和C.R.已经提供了关于在我之前使用vector :: erase小时的信息。向你们两人致敬。)