gpt4 book ai didi

c++ - 交换 vector 中的不同大小范围

转载 作者:行者123 更新时间:2023-11-30 03:18:26 33 4
gpt4 key购买 nike

在 C++ vector STL 库中,是否有一个函数可以使用另一个 vector 交换两个不同大小的范围?

例如给定的 vector 包含

[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'=========='\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,}

关于c++ - 交换 vector 中的不同大小范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54753569/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com