是否可以在C++中使用宏交换两个变量的出现?
Is it possible to swap the occurences of two variables using macros in C++?
我正在研究一个竞赛问题,我必须通过以下方式初始化一个向量:
vector<pair<int,int>> moves({{i,j}, {i,-j}, {-i,j}, {-i,-j},
{j,i}, {j,-i}, {-j,i}, {-j,-i}});
虽然我知道这不是最好的方法,并且我知道有许多不同的方法可以毫不费力地完成此操作,但我想知道是否有一种方法C++宏允许我简单地复制粘贴上述矢量的前四个元素以通过以下方式实现相同的效果:
vector<pair<int,int>> moves({{i,j}, {i,-j}, {-i,j}, {-i,-j},
#define i j
#define j i
{i,j}, {i,-j}, {-i,j}, {-i,-j}
#undef i
#undef j
});
上面的代码显然不起作用,因为变量的循环引用。
PS :尽管Matteo Italia的回答在上述上下文中是绝对正确的,但我更感兴趣的是知道使用宏交换变量是否可能在C++中发生,以及如何,如果可能的话?
如果你真的认为这是一个节省,你可以使用函数式宏并调用它两次,交换它的参数。
#define SIGN_COMB(a, b) {(a), (b)}, {(a), -(b)}, {-(a), (b)}, {-(a), -(b)}
vector<pair<int,int>> moves({SIGN_COMB(i, j), SIGN_COMB(j, i)})
像往常一样,宏扩展中的括号是为了避免在表达式作为参数传递时出现意外(如果传入,例如x+y
,否定的项将被-x+y
,如果-(x+y)
(。
宏是邪恶的,在这种情况下不是一个好主意。然而,既然这似乎是众所周知的,而且这个问题更像是学术性质的:思考"定义"而不是"交换"。您既不能使用 "i
" 也不能使用 "j
" 作为宏的名称,因为您希望两者都出现在处理后的代码中。因此,请为您的宏引入两个新的标识符。更新前四个元素以使用新标识符后,您可以根据要求复制并粘贴它们。
vector<pair<int,int>> moves({
#define a i
#define b j
{a,b}, {a,-b}, {-a,b}, {-a,-b},
#undef a
#undef b
#define a j
#define b i
{a,b}, {a,-b}, {-a,b}, {-a,-b}
#undef a
#undef b
});
相关文章:
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 命令行参数,cant 或两个变量
- 在 for 循环中更新两个变量时遇到问题C++
- C++ 编译时在两个变量之间交替
- C++ 如何在包含两个变量的结构中存储与变量不同数量的值?
- 为什么一个接一个声明的两个变量在内存中不相邻?
- 为什么动态分配的两个变量的内存位置不是连续的?
- 是否可以在C++中使用宏交换两个变量的出现?
- 计算机如何分配两个变量,我们如何计算两个变量之间的距离?
- 正确证明C 中的两个变量合理(我想将它们视为一个变量)
- 可视C 编译器将相同的存储位置提供给两个变量
- 尝试使用 {} 和 std::make_pair() 交换两个变量时的行为不同
- 在rootframework中的根文件中编写两个变量
- 最短路径,带有两个变量
- 加入两个变量和LCD打印
- 在循环中声明两个变量以逆转字符串?在C 中
- 具有两个变量的"for"循环,一个变量每次迭代递增,每隔一次迭代递增
- 如何在C++中使用一个类中两个变量的值
- 仅在C 中的一个变量上,两个变量函数的数值集成(使用数值配方库)
- 如何在我存储的两个变量之间生成随机数