执行以下操作的最佳方式是什么?
我想在向量中反转较小的范围并且没有找到比这更好的解决方案:我将较小的范围提取到新创建的向量,反转它然后在新的位置添加新创建的向量原始载体。
解释我想做什么的另一种方法是这样的:
原始载体:1 2 3 4 5 6 7 8 9 10 11。
通缉结果:1 2 3 4 5 6 7 10 9 8 11。
2.然后将具有3个元素10,9,8的新向量复制/附加到位置8处的原始向量中作为向量或元素分别在位置8,9,10处。
我确信有比上述方法更好的解决方案。
答案 0 :(得分:1)
你实际上可以写一个就地交换,
last_index - 1 <= first_index
。现在,这听起来不像是对我的抄袭,但正如Stroustrup自己曾经说过的那样:
我并不真正了解您的数据结构,但我非常确定在真实硬件上,
std::vector
会让它完全消失。
即。线性访问内存几乎总是更快,因此与必须来回跳转相比,将一些数字复制到新向量的成本实际上并不那么糟糕,如果跳转大于此值,可能会使CPU缓存瘫痪缓存行大小。
因此,我认为,出于所有实际原因,您的实施是最佳的,除非您的RAM耗尽。
答案 1 :(得分:0)
对不起,我不够清楚。我要求的是比这更好的东西:
cout&lt;&lt;“vpc contains:”&lt;
//Create a sub-vector - new_vpc.
vector<PathCoordinates>::const_iterator begin=vpc.begin();
typedef PathCoordinates type;
int iFirst=problemsStartAt;//first index to copy
int iLast=problemsEndAt-1;//last index -1, 11th stays
int iLen=iLast-iFirst;//10-8=2
vector<PathCoordinates> new_vpc;
//Pre-allocate the space needed to write the data directly.
new_vpc.resize(iLen);
memcpy(&new_vpc[0],&vpc[iFirst],iLen*sizeof(PathCoordinates));
cout<<"new_vpc.size():"<<new_vpc.size()<<endl;
for(int i=0;i<new_vpc.size();i++)
{
cout<<"new_vpc[i]:"<<new_vpc[i].strt_col<<", "<<new_vpc[i].strt_row<<", "<<new_vpc[i].end_col<<", "<<new_vpc[i].end_row<<endl;
}
reverse(new_vpc.begin(),new_vpc.end());
for(int i=0;i<new_vpc.size();i++)
{
cout<<"new_vpc[i]:"<<new_vpc[i].strt_col<<", "<<new_vpc[i].strt_row<<", "<<new_vpc[i].end_col<<", "<<new_vpc[i].end_row<<endl;
}
//Add sub-vector - new_vpc to main vector - vpc.
copy_n(new_vpc.begin(),new_vpc.size(),&vpc[problemsStartAt]);
//Output
for(int i=0;i<vpc.size();i++)
{
cout<<"vpc[i]:"<<vpc[i].strt_col<<", "<<vpc[i].strt_row<<", "<<vpc[i].end_col<<", "<<vpc[i].end_row<<endl;
}
/*
Output:
Inside backTrack()8,11
vpc contains:11
vpc contains:11
new_vpc.size():2
new_vpc[i]:265, 185, 100, 105
new_vpc[i]:240, 185, 121, 125
new_vpc[i]:240, 185, 121, 125
new_vpc[i]:265, 185, 100, 105
vpc[i]:440, 288, 460, 303
vpc[i]:440, 263, 460, 225
vpc[i]:440, 238, 498, 210
vpc[i]:388, 185, 459, 155
vpc[i]:363, 185, 823, 171
vpc[i]:338, 185, 823, 425
vpc[i]:308, 185, 308, 144
vpc[i]:290, 185, 65, 193
vpc[i]:240, 185, 121, 125
vpc[i]:265, 185, 100, 105
vpc[i]:228, 700, 80, 750
*/