在向量中交换不同的大小范围

时间:2019-02-18 17:08:43

标签: c++

在C ++向量STL库中,是否存在使用另一个向量交换两个大小不同的范围的函数?

例如给定的向量包含

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

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

2 个答案:

答案 0 :(得分:2)

没有特定的功能可以执行此操作,但是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'=========='\0'
    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,}

答案 1 :(得分:0)

您可以通过一系列插入范围调用来创建具有指定内容的新载体:

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);