如何解决有没有办法交换2个结构?
在 C++ 中,您可以在没有第三个变量的情况下交换 2 个数字:
int x = 10;
int y = 5;
x ^= y;
y ^= x;
x ^= y; //x = 5,y = 10
所以我想知道是否有类似的方法可以在没有第三个变量的情况下交换 2 个结构体:
struct Position{int x,y;};
int main()
{
Position firstPose{x = 10,y = 5;};
Position secPose{x = 5,y = 10;};
//Now I want to swap firstPose with secPose.
}
这可能吗?如果是这样的话;怎么做
解决方法
没有标准的方法可以在没有中间副本的情况下交换两个结构。可以说,swap 的主要好处之一是“中间副本”,这篇精彩的文章解释了 swap 如何是实现“强异常保证”的关键部分。 https://www.stroustrup.com/except.pdf
此外,如果目标是不制作结构的副本(因为它是资源密集型的),您可以使用 pimpl 惯用语设计您的类并仅交换指针(您仍然会有第三个变量,但它只是指向结构的原始指针)。
如果您想有效地使用 C++,请让自己熟悉异常安全,这确实是该语言发挥最大作用的领域
有点旧但还是不错的文章:http://www.gotw.ca/gotw/008.htm
最后,最终的解决方案是创建一个自定义交换函数:
SELECT SUBSTRING(Columns,CHARINDEX('SELECT',Columns) +6,CHARINDEX('FROM',Columns) - CHARINDEX('SELECT',Columns) - Len('FROM')-2)
FROM dbo.Mytab
恕我直言,最后一个选项更多是为了个人娱乐,而不是真正的生产代码。
,是的,有一些方法可以满足您的要求。但是,请注意,在两个值之间交换的 XOR 方法非常低效。
首先,让我们假设所需的结构:
struct position {
int x;
int y;
};
方法一
创建您自己的 swap()
函数:
void swap(position &pos1,position &pos2) {
// Swapping X
verify_overflow(pos1.x,pos2.x); // See about this below
pos1.x = pos1.x + pos2.x;
pos2.x = pos1.x - pos2.x;
pos1.x = pos1.x - pos2.x;
// Swapping Y
verify_overflow(pos1.y,pos2.y); // See about this below
pos1.y = pos1.y + pos2.y;
pos2.y = pos1.y - pos2.y;
pos1.y = pos1.y - pos2.y;
}
现在,您可以像这样实现它:
swap(v1,v2);
注意:为了防止由于溢出导致的未定义行为,可以使用以下子程序:
inline void verify_overflow(signed int si_a,signed int si_b) {
signed int sum;
if (__builtin_sadd_overflow(si_a,si_b,&sum)) {
std::cerr << "[error] Overflow is possible to happen.\n";
exit(1);
}
}
例如,当你设置一个结构体时:
position v1 = {2147483647,2147483644};
程序会产生如下错误,则UB不会发生:
[error] Overflow is possible to happen.
方法二
在 C++ 标准中已经有一个内置的 std::swap()
。它的好处是当结构改变时你不需要继续改变代码。代码应如下所示:
#include <iostream>
struct position {
int x;
int y;
};
int main(void) {
position v1 = {5,10};
position v2 = {10,5};
std::swap(v1,v2);
std::cout << v1.x << ' ' << v1.y << std::endl;
std::cout << v2.x << ' ' << v2.y << std::endl;
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。