交换矢量中的不同尺寸范围
swap different size range in a vector
在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);
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- C++嵌套if语句,基本货币交换
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- shell排序中的交换和比较
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 交换矢量中的不同尺寸范围
- 为什么使用std::swap不会在外部范围中隐藏其他交换函数
- 为什么基于指针交换两个值在函数范围之外不起作用?
- 交换实现:效率和适用范围?