C ++在向量中反转较小的范围

时间:2016-02-08 08:55:48

标签: c++ c++11

执行以下操作的最佳方式是什么?

我想在向量中反转较小的范围并且没有找到比这更好的解决方案:我将较小的范围提取到新创建的向量,反转它然后在新的位置添加新创建的向量原始载体。

解释我想做什么的另一种方法是这样的:

原始载体:1 2 3 4 5 6 7 8 9 10 11。

通缉结果:1 2 3 4 5 6 7 10 9 8 11。

  1. 按顺序将10,9,8复制到一个带有三个元素或复制元素8,9,10的新向量中,并将其转换为新向量。原始向量现在由九个元素组成,因为元素8,9,10在过程中被删除。
  2. 2.然后将具有3个元素10,9,8的新向量复制/附加到位置8处的原始向量中作为向量或元素分别在位置8,9,10处。

    我确信有比上述方法更好的解决方案。

2 个答案:

答案 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
     */