Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++:在不传递100万个参数的情况下分解代码

C++:在不传递100万个参数的情况下分解代码
EN

Stack Overflow用户
提问于 2016-06-13 00:08:46
回答 2查看 112关注 0票数 3

我正在进行C/C++编程(主要是C++),我发现自己需要分解代码,这些代码实际上是原来的两倍,除非每次出现的“左”都被替换为“右”。一旦代码完成,我需要知道它是正在执行的“左”或“右”版本,但仅此而已,它们都将返回一个我可以理解的数字(一旦与左或右信息组合在一起)。

在这个设置中,每个更改都需要进行两次,这是很烦人的。

因此,我可以简单地用"other“替换左/右,然后调用两次分解函数,每次都知道我是为”左“还是”右“调用它。

现在,当我们到达代码的那一部分时,已经有了一百万个变量(游标、ID、数组正在填充等)。所以,如果我想分解左/右代码,我需要这个函数有一个非常多的参数,这看起来很难看。

我也不想用只在本例中使用的属性重载我的C++类。

有什么建议可以使这里顺利地分解吗?

代码语言:javascript
运行
AI代码解释
复制
    int arrayRight[many], arrayLeft[many], cursor;

    while(1)
    {
         rightThing = arrayRight[cursor];
         // Process with RightThing assigned
         // ...
         // ...
         // ...

        leftThing = arrayLeft[cursor]
         // Process with RightThing assigned
         // ...
         // ...
         // ...

        cursor++;
   }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-13 00:20:05

尝尝这个?(它只在C++14上工作,因为它使用自动lambda)

代码语言:javascript
运行
AI代码解释
复制
auto func = [&](auto& theThing){
    // blah, blah code
};

func(arrayRight[cursor]);
func(arrayLeft [cursor]);

这里的[&]意味着将相同作用域中的所有变量导入lambda函数。

对于较早的C++版本,我使用以下代码作为一种丑陋的方式(在学校的C99项目中)。

代码语言:javascript
运行
AI代码解释
复制
int* pData[2] = {arrayRight, arrayLeft};
for (int i=0; i<2; i++)
{
    int* theThing = pData[i];
    // blah, blah
}

我的一些朋友告诉我宏可以持有VA_ARGS,所以这里有一个宏方法。这应该适用于GCC。但对于MSVC 2003来说,它不起作用。(__typeof需要被boost::typeof取代,并且在较早版本的MSVC中不支持匿名结构定义)

代码语言:javascript
运行
AI代码解释
复制
#define in(...) __VA_ARGS__
#define PP_ARG_N( \
          _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, _10, \
         _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
         _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
         _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
         _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
         _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
         _61, _62, _63, N, ...) N
#define PP_RSEQ_N()                                        \
         63, 62, 61, 60,                                   \
         59, 58, 57, 56, 55, 54, 53, 52, 51, 50,           \
         49, 48, 47, 46, 45, 44, 43, 42, 41, 40,           \
         39, 38, 37, 36, 35, 34, 33, 32, 31, 30,           \
         29, 28, 27, 26, 25, 24, 23, 22, 21, 20,           \
         19, 18, 17, 16, 15, 14, 13, 12, 11, 10,           \
          9,  8,  7,  6,  5,  4,  3,  2,  1,  0
#define PP_NARG_(...)    PP_ARG_N(__VA_ARGS__)
#define PP_NARG(...)     PP_NARG_(__VA_ARGS__, PP_RSEQ_N())

#define withInternal(dataType, desiredType, x, dataCnt, data...) for(struct {size_t __i; dataType __t[dataCnt];} __s = {0, data}; x = __s.__t[__s.__i], __s.__i < dataCnt; __s.__i++)
#define with(x, ...) withInternal(__typeof(__VA_ARGS__), __typeof(__VA_ARGS__), x, PP_NARG(__VA_ARGS__), __VA_ARGS__)
#define withConst(x, ...) withInternal(__typeof(__VA_ARGS__), __typeof((__VA_ARGS__) + 0), x, PP_NARG(__VA_ARGS__), __VA_ARGS__)
#define withType(tn, x, ...) withInternal(tn, tn, x, PP_NARG(__VA_ARGS__), __VA_ARGS__)

当你使用它时:

代码语言:javascript
运行
AI代码解释
复制
int main()
{
    int x;
    int s1=2, s2=3;
    with(x, in(s1, s2))
        cout<<x<<endl;
    withConst(x, in(45, 55))
        cout<<x<<endl;
    withType(int, x, in(45, s1, 55, s2))
        cout<<x<<endl;
    return 0;
}

我相信这是比较清楚的。

  • with使用变量(基本上),因为当将consts传递给with时,gcc __typeofx生成一个无法分配的自动const类型。
  • withConst使用x+0技巧来删除const类型的变量,但是+操作符并不适用于每一种数据类型,因此它有其局限性。
  • withType指定一种数据类型,它适用于混合情况。
票数 4
EN

Stack Overflow用户

发布于 2016-06-13 00:26:51

我想你可以试着把这些东西分批到一起:

代码语言:javascript
运行
AI代码解释
复制
while(1)
{
    vector<int> things;

    int rightThing = arrayRight[cursor];
    things.push_back(rightThing);

    int leftThing = arrayLeft[cursor];
    things.push_back(leftThing);

    for(vector<int>::iterator thing = things.begin(); thing != things.end(); ++thing)
    {
        // Process Thing
        // ...
        // ...
        // ...
    }

    cursor++;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37784640

复制
相关文章
YbtOJ 915「欧拉函数」欧拉欧拉
规定一个正整数序列 a 是合法的,当且仅当它的长度为 k,且序列中的每一个 a_i 都小于等于 n。
yzxoi
2022/09/19
5330
算法模板——线性欧拉函数
实现功能:求出1-N的欧拉函数,然后应对若干个询问操作 其实就是个素数判定+欧拉函数性质的二合一 代码如下,我觉得应高不难懂,只要你知道欧拉函数的性质 var i,j,k,l,m,n:longint; a,b:array[0..10000005] of longint; procedure phi; var i,j:longint; begin m:=0;a[1]:=1; for i:=2 to
HansBug
2018/04/11
5610
算法模板——单个值欧拉函数
输入N,输出phi(N) 这样的单个值欧拉函数程序一般见于部分数论题,以及有时候求逆元且取模的数不是质数的情况(逆元:A/B=A*Bphi(p)-1 (mod p),一般常见题中p是质数,phi(p)-1=p-2) (Tip:我是来水经验的不解释,不过话说真的好久没写这个了TT) 1 var i:int64; 2 function Eula(x:int64):int64; 3 var res:int64;i:longint; 4 begin 5
HansBug
2018/04/10
6360
欧拉函数(欧拉筛)--模板
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; typedef long long llong; const int MAXN = 25000000 + 10; llong phi[MAXN + 200]; llong prime[MAXN + 200]; bool book[MAXN + 200]; void phi_prime (int n) { int i, j; mems
用户2965768
2018/08/30
4240
算法帝国里的牛人们:欧拉
点击标题下「大数据文摘」可快捷关注 1791年,著名奥地利作曲家约瑟夫·海顿出席了乔治·弗里德里希·亨德尔在伦敦威斯敏斯特大教堂的盛大清唱剧《弥赛亚》的演出。演出快要结束时,海顿被上千名合唱队和管弦乐
大数据文摘
2018/05/22
8480
微分方程与欧拉法
本文介绍了如何利用数值求解方法解决微分方程,包括欧拉法、龙格-库塔方法等,并给出了具体的MATLAB代码示例。
用户1147754
2018/01/03
1.1K0
微分方程与欧拉法
数论 欧拉函数_数论欧拉函数
其中p1, p2……pn为n的所有质因数,n是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
全栈程序员站长
2022/09/23
3510
数论 欧拉函数_数论欧拉函数
【acm】【数论】欧拉定理与欧拉函数
除此之外,还可以求有关阶,原根,指数相关的问题。有些题目也需要转化为带有欧拉函数的公式。
duadua
2022/10/31
7330
【acm】【数论】欧拉定理与欧拉函数
欧拉函数及其计算_计算n的欧拉函数
计算这个值的方法就叫做欧拉函数,用φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。
全栈程序员站长
2022/09/23
1.1K0
欧拉函数及其计算_计算n的欧拉函数
欧拉函数、欧拉定理学习笔记
\varphi(n) = \sum \limits _{i=1}^n \left[ i \nmid n \right]
Clouder0
2022/09/23
9600
欧拉图
1. 定义 1.1 欧拉通路 & 欧拉回路 通过图(无向图或有向图)中所有边一次且仅一次行遍所有顶点的通路称作欧拉通路。 通过图(无向图或有向图)中所有边一次且仅一次行遍所有顶点的回路称作欧拉回路。 【注】规定平凡图是欧拉图。 1.2 欧拉图 & 半欧拉图 具有欧拉回路的图称为欧拉图。 具有欧拉通路而无欧拉回路的图称作半欧拉图。 2. 性质 无向图 是欧拉图当且仅当 是连通图且没有奇度顶点。 无向图 是半欧拉图当且仅当 是连通的且恰有两个奇度顶点。 有向图 是欧拉图当且仅当
hotarugali
2022/03/01
8490
欧拉函数
通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn) 其中 p1, p2……pn 为 x 的所有质因数,x 是不为 0 的整数 φ(1)=1(唯一和 1 互质的数就是 1 本身)【注意:每种质因数只一个。比如 12=223】
Cell
2022/02/25
4670
欧拉函数
欧拉公式
欧拉公式、麦克斯韦方程组、牛顿第二定律、勾股定理、薛定谔方程、质能方程、德布罗意方程组、1+1=2、傅立叶变换、圆的周长公式。
小小杨
2021/10/13
3.4K0
欧拉函数
如果对于任意两个正整数m和n,均有f(mn)=f(m)f(n),就称为完全积性函数。
饶文津
2020/05/31
8980
欧拉回路与欧拉路径
欧拉回路与欧拉路径 如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(欧拉通路)。 如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit)。 说的直白点,欧拉回路就是从一个点
attack
2018/04/10
2.2K0
欧拉回路与欧拉路径
欧拉函数
欧拉函数 表示的是小于等于 且和 互质的正整数的个数。(易知 )
hotarugali
2022/03/13
1.1K0
欧拉 函数
什么是互质 如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。
全栈程序员站长
2022/09/23
4420
欧拉 函数
欧拉函数
问题:求[L, R]中K ( 假设φ(n)表示1..n-1中与n互质的数的个数。对于[L,R]中的任意一个除K 以外的整数y,满足φ(K)≤φ(y)且φ(K)=φ(y)时,K<y ),K是[L,R]中φ(n)最小并且值也最小的数。
全栈程序员站长
2022/09/06
4290
欧拉函数详解
欧拉函数 我们用 表示欧拉函数 定义: 表示对于整数n,小于等于n中与n互质的数的个数 性质 1. 为积性函数 证明: 此处证明需要用到下面计算方法1中的内容,建议先看后面再回过头来看这里 假设存在p,q,且 将n,p,q进行质因数分解 那么 因为 显然 这种方法也是常见的证明一个函数是积性函数的方法 2. 3.1到n中与n互质的数的和为 计算方法 计算单值欧拉函数 假设我们需要计算 分情况讨论
attack
2018/04/11
1.1K0
欧拉函数及其证明_欧拉函数证明题
计算这个值的方法就叫做欧拉函数,以φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。
全栈程序员站长
2022/09/23
4870
欧拉函数及其证明_欧拉函数证明题

相似问题

将显式欧拉转换为隐式欧拉(通过定点迭代)

13

带数组的欧拉隐式方法

20

ODEs积分的隐式欧拉法

13

用显式欧拉法(MATLAB)求解ODE系统

11

欧拉-拉格朗日的Sympy隐微分

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档