繁体   English   中英

为什么不为std :: vector重载operator + =()?

[英]Why not overload operator+=() for std::vector?

我已经开始学习C ++了,所以我不知道在缺乏知识/经验的情况下,为什么对于新手来说看似简单的事情就像我将要描述的那样尚未出现在STL中。 要将矢量添加到另一个矢量,您必须输入以下内容:

v1.insert(v1.end(), v2.begin(), v2.end());

我想知道在现实世界中人们是否只是重载+ =运算符以使其更加冗长,例如对于

template <typename T>
void operator+=(std::vector<T> &v1, const std::vector<T> &v2) {
    v1.insert(v1.end(), v2.begin(), v2.end());
}

那么你可以

v1 += v2;

我也把这个设置为push_back到“+ =”一个元素到最后。 是否有某些原因这些事情不应该由熟练使用C ++的人完成或特别避免?

这实际上是我希望以append()重载的形式看到这个功能的情况。 operator+=有点模棱两可,你的意思是将每个向量的元素相互添加吗? 或者你的意思是追加?

但是,就像我说的那样,我会欢迎: v1.append(v2); 它清楚而简单,我不知道它为什么不存在。

我认为主要原因是+=的语义不明显。 还有,你在这里的意思,但有一个同样有效的意义,这是大小相等的矢量的每个元素的元素方面的加法。 由于这种模糊性,我认为他们认为最好依靠用户直接调用insert

只有在不改变运算符的含义时 ,才应使运算符过载。*

这意味着,例如,如果没有两个对象的乘积的数学定义,请不要重载这些对象的乘法运算符。 如果存在数学对应关系,则运算符重载可以使类更方便使用,方程式以a * b + c的形式表示,而不是更冗长(a.multiply(b))。add(c)Where使用加法和乘法运算符,加法和乘法应该是意图。 任何其他意义都可能使其他人感到困惑。 其中一些其他类型的重载运算符是可接受的(并且,在我看来, 更可取 )是智能指针,迭代器,复数,向量和bignums。

这源于C ++的一个设计目标,即应该可以定义与内置类型一样易于使用的类。 当然,您可以在类上定义运算符,这些运算符也不是数学概念。 您可能希望重载==和!=运算符而不是编写isEqual方法,并且可能希望重载=因为编译器的默认赋值运算符不是您想要的。

另一方面,重载操作符以执行意外操作,例如定义^将字符串转换为日语,这是模糊和危险的。 你的同事们不会很高兴发现看起来像独家或比较的东西实际上是非常不同的东西。 然后解决方案是编写类,以便编写清晰且可维护的代码,无论是使用运算符重载还是避免使用它。

添加两个向量对于定义运算符而言太过模糊。 正如其他人所表明的那样,许多人对这意味着什么有不同的想法,而对于字符串,人们普遍认为将两个字符串加在一起就意味着连接。 在您的示例中,您是否想要对所有元素进行组件明智添加,向末尾添加元素或将两个向量连接在一起并不完全清楚。 虽然这样做可能更简洁,但使用运算符重载来创建自己的编程语言并不是最好的方法。

*是的,我知道Stroustrup重载<<和>>来进行流操作而不是位移。 但是,与算术和指针运算符相比,这些并不常用,并且可以说现在每个人都知道如何使用cout,通常理解<<和>>是插入器和提取器运算符。 (他最初只是尝试使用<和>进行输入和输出,但是这些运算符的含义在每个人的脑海中根深蒂固,代码是不可读的。)

除了其他人提到的这种语法不直观且因此容易出错之外,它还违背了一个好的设计规则,使得通用算法应用于各种容器自由函数和容器特定算法 - 成员函数。 大多数容器都遵循这个规则,除了std::string ,Herb Sutter因其整体设计而受到了很多抨击。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM