【问题标题】:C++ Reverse a smaller range in a vectorC ++反转向量中的较小范围
【发布时间】:2016-05-17 21:00:51
【问题描述】:

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

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

解释我想要做的另一种方式是这样的:

原始向量: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.然后将具有 3 个元素 10、9、8 的新向量作为向量或逐个元素分别复制/附加到位置 8 处的原始向量中。

我相信有比上面提到的方法更好的解决方案。

【问题讨论】:

  • 您知道std::reverse 标准函数吗?它需要两个定义一个 range 值的迭代器来反转。尝试一下。
  • 在您最喜欢的搜索引擎中输入“reverse C++”时,该函数可以方便地弹出顶部结果 - 实际上是多次 -
  • @JoachimPileborg 我真的读到这更像是“我不知道线性复制方法是否最优”,所以我真的认为这是一个有价值的问题;您可以轻松找到实施他的方法的可行方法这一事实并没有改变这一点:)
  • @JoachimPileborg 您的评论是最佳的,为什么不将其发布为答案?

标签: c++ c++11


【解决方案1】:

实际上你可以写一个就地交换,

  • 获取要交换的最后一个和第一个索引,
  • 交换这些,
  • 减少最后一个索引并增加第一个索引,
  • 并重复直到last_index - 1 <= first_index

现在,对我来说,这听起来不像是抄袭,但正如 Stroustrup 本人曾经说过的那样:

我不太了解您的数据结构,但我很确定在真正的硬件上,std::vector 会彻底解决问题。

即线性访问内存几乎总是更快,因此将一些数字复制到新向量的成本确实不是那么糟糕,与必须来回跳转相比,如果跳转大于缓存,可能会破坏 CPU 缓存线条大小。

因此,我认为出于所有实际原因,您的实现是最佳的,除非您的 RAM 用完。

【讨论】:

    【解决方案2】:

    对不起,我不够清楚。我要求的是比这更好的东西:
    cout

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      相关资源
      最近更新 更多