我知道有std::swap
可以交换一个向量中的两个元素,或者迭代交换两个相同长度的段。例如,我可以编写一个循环以便在向量abcdefgh
中交换bcd
和efg
,从而生成aefgbcdh
。但我可以做bcd
和ef
(不同长度)吗?或者std::vector
有没有其他功能可以实现这个功能?是否有交换C++向量中的两个段的函数?
1
A
回答
5
如果分段相邻,则可以使用std::rotate
。例如:
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
比方说,我想用{ 4, 5, 6, 7 }
来交换{ 1, 2, 3 }
。我可以这样做:
std::rotate(v.begin() + 1, v.begin() + 4, v.begin() + 8);
如果这些段是不相邻,您可以通过使用rotate
两次做到这一点,但它可能会做更多的工作比是绝对必要的。例如,交换{ 1, 2 }
与{ 4, 5, 6, 7 }
std::rotate(v.begin() + 1, v.begin() + 4, v.begin() + 8);
std::rotate(v.begin() + 5, v.begin() + 7, v.begin() + 8);
3
这减少了相等长度间隔互换后跟一个旋转。
等长间隔交换减少了问题'移动到另一个地方的间隔',这可以在std::rotate
就地实施。
如果半开区间[a,b)
正在向前推进到x
,则:
std::rotate(a,b,x);
如果向后移动到y
则:
std::rotate(y,a,b);
如果我们假设,我们可以得到在间隔正确的顺序(在序列中右侧之前的左间隔),那么我们可以这样做:
template<class I>
void swap(I a, I b, I x, I y){
using std::distance; using std::next; using std::advance;
auto d_ab=distance(a,b);
auto d_xy=distance(x,y)
auto d=(std::min)(d_ab,d_xy);
std::swap_ranges(a,next(a,d),x);
advance(a,d);
advance(x,d);
if (a==b){
std::rotate(b,x,y);
}else{
std::rotate(a,b,x);
}
}
可以完成避免不止一次元素遍历的微优化,但是对于向量迭代器,额外的优化可以接近免费。
一个工业强度的人可以做标签调度,为随机访问迭代器写一个漂亮的代码,并为其他迭代器做一个双迭代器循环交换元素(手动交换范围边界检查),末尾有类似的rotate
。
如果我们不知道的顺序是a
,b
,x
,y
我们需要需要随机访问迭代器(并获得<
访问)。然后我们需要包装上面的std::rotate
调用以更改参数的顺序。
通过访问end
迭代器,我们可以在转发迭代器仍然效率低下的情况下做到这一点。
相关问题
- 1. 在C中交换两个向量
- 2. 是否有可能从函数返回两个向量?
- 3. 用于确定两个线段是否相交的C++程序
- 4. 遇到问题,两个函数向量C++中的实现
- 5. 是否有可能在运行时交换C函数实现?
- 6. 什么是交换向量中的两个元素的惯用方式
- 7. 交换c中的两个结构
- 8. C++有构造函数的类向量
- 9. 优雅地评估R中两个值向量的两个变量的函数?
- 10. 在一个向量中交换两个值
- 11. 是否曾经有一点不使用第三个交换两个变量?
- 12. 检查是否所有的值都在两个向量
- 13. 检查两个向量是否相等
- 14. SymPy:交换两个变量
- 15. 通过函数中的地址交换两个参数出错
- 16. 理解的std ::交换两个指针和std ::向量
- 17. 测试两个函数变量指向相同的函数吗?
- 18. C++内置交换两个数值?
- 19. 交换两个数字没有用C第三/ C++
- 20. 在C++中随机交换数组中的两个元素
- 21. 如何绘制三个变量的两个函数的交集?
- 22. C++交换两个使用的代码
- 23. python中是否有一个接受变量的随机函数?
- 24. 我们如何编写一个交换两个枚举变量的函数?
- 25. C++:比较两个向量
- 26. 比较两个向量C++
- 27. 交换实现函数c
- 28. 是否可以在C++中添加两个函数?
- 29. cubac中是否有函数可以将sigmoid函数与向量一起使用?
- 30. 是否有一个相当于c#中array_merge的函数
*“或者std :: vector中是否有其他函数可以实现这个功能?”*请注意,StdLib中的很多类都提供了最小的接口。例如,'vector'没有'sort'成员函数,因为对随机访问序列进行排序可以实现为一个自由函数(不需要特权访问和实现细节)。 – dyp 2014-10-11 19:49:39
您的细分总是与您的例子中的'bcd'和'ef'相邻吗?或者是否有可能需要交换'bcd'和'fg'? – AnT 2014-10-11 20:07:09