我的结构定义为
typedef struct _ans{
int **a;
int *b; double*c; int *d, int *e, float *f, double *g;} ans;
ans *temp;
“ a”是一个二维数组,对于该数组中的每一行,让第i行,我将在向量“ b,c和d的第i个元素中定义一个对应的值,等等”。
我想创建一个函数“ func”来修改数组“ a”中的第i行;显然,每当修改“ a”中的第i行时,也应重新计算其在“ b,c和d等”向量中的对应值。
我有两种可能性:
1-将func定义为
func(temp->a[i], temp->b[i], temp->c[i], temp->d[i], temp->e[i], temp->f[i],temp->g[i])
具有许多输入参数,但全部与第i行有关。 要么 2-只需将“ temp”作为func的唯一输入参数即可:
func(temp)
然后在函数内,我可以轻松访问其他向量b,c等中的第i行及其对应的值。
我想知道在代码效率和计算时间方面,这两种情况中哪一种效率更高。
任何建议都值得赞赏
答案 0 :(得分:2)
下面仅是一般性内容。到目前为止,您可能有充分的理由做出选择,但是对我来说,它们看起来是错误的。
您的设计是错误的,并且您对节省计算时间的关注放错了地方。软件的最大成本是人工成本。始终优先考虑的是使您的代码尽可能简单明了且易于理解。
您的数据结构中存在两个明显的缺陷,即过度使用指针和对相关项进行分组不足(换句话说,并行数组)。这样会更好
struct Row
{
std::vector<int> a;
int b;
double c;
int d;
int e;
float f;
double g;
};
struct Ans
{
std::vector<Row> a;
};
Ans temp;
通过这种重新设计,您的func
函数的正确位置变得显而易见。它应该是Row
结构的一种方法,在该方法中它将可以访问所需的所有数据。
struct Row
{
void func();
std::vector<int> a;
int b;
double c;
int d;
int e;
float f;
double g;
};
尽管改进了设计,但此解决方案等效于您的第二个选择。
您还应该努力使结构中的数据私有。
答案 1 :(得分:1)
首先,无需使用C ++的typedef
结构。只是说
struct ans {
int **a;
int *b; double*c; int *d; int *e; float *f; double *g;
};
接下来,不要使用C样式的数组,例如,使用std::vector
之类的标准容器。
#include <vector>
struct ans {
std::vector<std::vector<int> > a;
std::vector<int> b;
std::vector<double> c;
std::vector<int> d, e;
std::vector<float> f;
std::vector<double> g;
};
这样,您不必自己搞乱动态内存。
最后,只需定义temp
对象,再次无需动态分配它
ans temp;
要回答这个问题,通过引用传递结构将是最有效的,因为它涉及的复制数据最少:
void func(ans &a);
尽管,传递参数时间通常可以忽略,除非它一遍又一遍地做多次。