一周前我开始研究指针和动态数组的主题。作为一种实践,我制作了以下程序,允许用户添加两个他们想要的大小的向量:
#include <iostream>
#include <iomanip>
using namespace std;
void leer_vector(int v[], int n)
{
cout << "Ingrese los elementos del vector:\n\n";
for (int i = 0; i < n; i++)
cin >> v[i];
}
void escribir_vector(int v[], int n)
{
cout << "Los elementos del vector son:\t\t";
for (int i = 0; i < n; i++)
cout << v[i] << setw(5);
}
void sumar_vectores(int v1[], int v2[], int v3[], int n)
{
for (int i = 0; i < n; i++)
v3[i] = v1[i] + v2[i];
}
int main()
{
int dimension_vector;
int *p_vector1, *p_vector2, *p_vector3;
cout << "\250Cu\240ntos elementos desea ingresar?:\t";
cin >> dimension_vector;
cout << '\n';
p_vector1 = new int[dimension_vector];
p_vector2 = new int[dimension_vector];
p_vector3 = new int[dimension_vector];
leer_vector(p_vector1, dimension_vector);
cout << '\n';
leer_vector(p_vector2, dimension_vector);
cout << '\n';
escribir_vector(p_vector1, dimension_vector);
cout << "\n\n";
escribir_vector(p_vector2, dimension_vector);
cout << "\n\n";
p_vector3 = sumar_vectores(p_vector1, p_vector2, dimension_vector);
escribir_vector(p_vector3, dimension_vector);
cout << "\n\n";
delete[] p_vector1;
delete[] p_vector2;
delete[] p_vector3;
system("pause");
return 0;
}
我的疑问是在定义过程时,void sumar_vectores
因为我使用了四个参数并且我不相信使用那个数量的参数。那么,一方面,在一个函数/过程中使用三个以上的参数是否正确?根据这个答案,只要可以使用三个以上的参数,就应该避免(这就是我对答案的理解)。
如果是这种情况,我该如何修改过程定义void sumar_vectores
以使其使用三个或更少的参数?
提前感谢您的回答和/或评论。
正如开膛手杰克所说,让我们分部分进行:
好吧,就像几乎所有东西一样……这取决于。
逻辑因素。
在您指出的答案中,他们指的是逻辑问题;也就是说,使用太多参数可能表明函数设计不佳。也许这个函数做的工作太多,把它分解成几个更小的函数是明智的。
情况并非总是如此:某些函数只需要一定数量的参数即可工作(例如您自己的
sumar_vectores( )
.但是,有一些机制可以促进这些功能的使用;如答案本身所示,使用复杂数据类型非常常见,例如
struct
(在 C 中)或class
(在 C++ 中)。简而言之:不是创建一个有 5 个参数的函数,而是创建一个有
struct
5 个class
字段的函数,填充它,然后将它作为唯一的参数传递。物理因素
这是一个不同的观点。在某些架构上,使用更少的参数可以加快函数调用。
例如,在 x86 上,fastcall调用约定使用 3 个寄存器(我认为是 3 个,不确定)来传递前 3 个参数,并将其余的压入堆栈。相比之下,cdecl或pascal将所有参数压入堆栈,因此它们的速度较慢。顺便说一句,默认情况下使用fastcall ;-)
压入堆栈比使用寄存器慢,因为它涉及内存读/写。
但是......这些幕后的事情不应该让你担心,除非你正在编写关键代码(速度或大小),你可以在 99.99% 的时间里忽略它们。编译器可以做一些事情,它会尽可能地优化代码。
此外,C++ 可以使用函数
inline
,甚至不涉及真正的调用。来吧,你可以忽略身体问题......虽然我认为值得知道,因为我们正在处理这个问题:-)好吧,正如我之前所说...这取决于。
你在 C++... 使用类!
在你的情况下,你可以做
以上可以完美地用于您想要的。而且,通过使用类,您可以保存调用的最后一个参数,该参数只有 3 个参数:
而且,当我们这样做的时候,我挑战你去实现它:
用你再多存一个;甚至,重载:
operator+( )
所以你仍然使用 2 个参数,但它看起来更漂亮:-)
速度还是尺寸?
另一种攻击特定情况的方法是使用特殊值来指示向量的结束;例如,
-1
用作指标。因此,在填充时,当用户完成输入时,您手动将a
-1
放入数组中。现在,您还可以保存函数的最后一个参数...代价是每次都必须计算向量的大小,计算元素直到到达
-1
.所以你的功能是
当然,您也可以利用函数返回内容的能力:
你将只剩下2个。
已经放...
坚持您的具体情况,您仍然可以更改向量背后的逻辑;在您的代码中,向量的大小为此目的保存在一个变量中......您不能将该大小保存在向量本身中吗?具体来说,在位置
vector[0]
。这样,您的功能与前一种情况相同:
但是现在您不需要计算每次调用的大小......相反,您的实际数据从 position 开始
vector[1]
。而且向量的控制逻辑有点复杂;例如,要创建一个7 元素向量:
现在完成并卷曲卷曲一点:
通过这最后一步,您的矢量可以透明地与其他功能一起使用,但您知道要获得大小,只需执行
嗯...我认为这个问题最终会因基于意见或过于宽泛而被关闭:-O
它没有任何问题,也没有任何问题,因为它不是正确性问题。您链接的答案(来自 SoftwareEngineering)谈到Uncle Bob的Clean Code book作为确定函数中参数数量的参考,但有几个原因导致该答案与修复无关:
奇怪的是,C++ 标准在附件 B 中指出函数可以接收的参数取决于编译器的实现,但它们至少应为 256。
如果你在一个函数中需要 256 个参数,这并不意味着它是错误的1,但它会使代码非常难以理解。
没有必要重新发明轮子。
C++ 标准库提供了一个包装器,专门用于您正在执行的操作:
std::valarray
,您可以valarray
使用加号以最自然的方式添加两个:1肯定表明糟糕的设计决策和/或荒谬的要求。