Luk*_*ndt 23 c++ stl vector operator-overloading
我已经开始学习C++了,所以我不知道在缺乏知识/经验的情况下为什么对于新手来说看似简单的东西,因为我将要描述的内容尚未出现在STL中.要将矢量添加到另一个矢量,您必须输入以下内容:
v1.insert(v1.end(), v2.begin(), v2.end());
Run Code Online (Sandbox Code Playgroud)
我想知道在现实世界中人们是否只是重载+ =运算符以使其更简洁,例如对于
template <typename T>
void operator+=(std::vector<T> &v1, const std::vector<T> &v2) {
v1.insert(v1.end(), v2.begin(), v2.end());
}
Run Code Online (Sandbox Code Playgroud)
那么你可以
v1 += v2;
Run Code Online (Sandbox Code Playgroud)
我也把这个设置为push_back到"+ ="一个元素到最后.是否有某些原因这些事情不应该由熟练使用C++的人完成或特别避免?
Eva*_*ran 24
这实际上是我希望以重载形式看到此功能的情况append().operator+=有点模糊,你的意思是将每个向量的元素相互添加吗?或者你的意思是追加?
但是,就像我说的那样,我会欢迎:v1.append(v2);它清晰而简单,我不知道它为什么不存在.
仅当您不更改这些运算符的含义时才应重载这些运算符。*
这意味着,例如,如果两个对象的乘积没有数学定义,则不要重载这些对象的乘法运算符。如果存在数学对应关系,则运算符重载可以通过允许以 a*b + c 的形式表示方程而不是更冗长的 (a.multiply(b)).add(c) 形式来表示方程,从而使类更方便使用使用加法和乘法运算符时,加法和乘法应该是本意。任何其他含义很可能会让其他人感到困惑。其他一些可以接受重载运算符(并且在我看来更可取)的类型是智能指针、迭代器、复数、向量和 bignum。
这遵循 C++ 的设计目标之一,即应该可以定义与内置类型一样易于使用的类。当然,您可以在类上定义一些也不是数学概念的运算符。您可能希望重载 == 和 != 运算符,而不是编写 isEqual 方法,并且可能希望重载 =,因为编译器的默认赋值运算符不是您想要的。
另一方面,重载运算符来执行意想不到的操作(例如定义 ^ 将字符串翻译为日语)是晦涩且危险的。你的程序员同事不会高兴地发现看起来像是排他或比较的东西实际上是非常不同的。解决方案是编写类,以便轻松编写清晰且可维护的代码,无论这意味着使用运算符重载还是避免它。
将两个向量相加太模糊,无法定义运算符。正如其他人所表明的那样,许多人对其含义有不同的看法,而对于字符串来说,人们普遍认为将两个字符串添加在一起意味着串联。在您的示例中,尚不完全清楚您是否想要对所有元素进行组件明智的添加,在末尾添加一个元素,还是将两个向量连接在一起。尽管这样做可能更简洁,但使用运算符重载来创建您自己的编程语言并不是最好的方法。
*是的,我知道 Stroustrup 重载了 << 和 >> 来进行流操作而不是位移。但与算术和指针运算符相比,这些运算符最初并不经常使用,并且可以说,现在每个人都知道如何使用 cout,人们普遍认为 << 和 >> 是插入器和提取器运算符。(他最初尝试仅使用 < 和 > 进行输入和输出,但这些运算符的含义在每个人的头脑中根深蒂固,以至于代码不可读。)
我认为主要原因是 的语义+=不明显。还有,你在这里的意思,但有也是一个同样有效的意义,这是大小相等的矢量的每个元素的元素方面的加法。由于这种歧义,我认为他们认为最好依靠用户直接打电话insert。