交换矢量中的不同尺寸范围

swap different size range in a vector

本文关键字:范围 交换      更新时间:2023-10-16

在C 向量STL库中,s有一个函数,可以使用另一个向量交换两个不同大小的范围?

例如,给定向量包含

[1, 2,3 ,4,5, 6,7,8,9 ]

预期结果:[1,6,7,8,9,4,5,2,3]

没有特定功能可以执行此操作,但是std::rotate的多次用途就足够了。

该算法以两个步骤执行此操作:首先,我们将最右边的范围移至左侧,然后我们在最右边的范围和最左边的范围内移动任何内容范围。然后,用户程序员只需要输入正确的迭代器偏移,示例是

  • 1最左边的范围,从'2'
  • 开始
  • 3最左边范围的一正式末端,以'4'
  • 开始
  • 5最右边的范围,从'6'
  • 开始
  • vector.end()最右范围的末端(如果列表中的" 9"元素有更多元素,也可以进行9

执行此操作的代码非常简单:

#include<algorithm>
#include<iostream>
#include<vector>
template<typename IT>
void swap_ranges(IT start_a, IT end_a, IT start_b, IT end_b) {
    //Will return the position after the moved elements
    auto it = std::rotate(start_a, start_b, end_b);
    //Will determine the point where the new range needs to be moved from
    auto new_start_a = (end_a - start_a) + it;
    std::rotate(it, new_start_a, end_b);
}
int main() {
    std::vector<int> values{1,2,3,4,5,6,7,8,9};
    std::cout << "Before: {";
    for(int value : values)
        std::cout << value << ',';
    std::cout << "}n";
    //=========================='2'================='4'================='6'==========''
    swap_ranges(values.begin() + 1, values.begin() + 3, values.begin() + 5, values.end());
    std::cout << "After: {";
    for(int value : values)
        std::cout << value << ',';
    std::cout << "}n";
}

输出:

Before: {1,2,3,4,5,6,7,8,9,}
After: {1,6,7,8,9,4,5,2,3,}

您可以使用指定内容创建一个新的向量,并带有一系列插入范围呼叫:

std::vector<int> vec = { ... };
std::vector<int> newvec;
newvec.insert(newvec.end(), vec.begin() + 0, vec.begin() + 1);
newvec.insert(newvec.end(), vec.begin() + 5, vec.begin() + 9);
newvec.insert(newvec.end(), vec.begin() + 3, vec.begin() + 5);
newvec.insert(newvec.end(), vec.begin() + 1, vec.begin() + 3);