C ++ STL - 相当于赋值的运算符函数对象模板?

时间:2015-07-13 20:30:04

标签: c++ stl std

C ++中是否有赋值运算符对象?和std::plus一样,但要做+ =? (同样地minusmultipliesdivides等等。)

编辑 - 动机:

我认为最好通过使用以下代码中的函数对象(std :: plus()等)来避免额外的副本。

template<typename Op>
static vector<int>& memberwiseAssignOp(vector<int>& lhs, vector<int> rhs, Op op)
{
    size_t const len = rhs.size();

    if (len > lhs.size())
    {
        lhs.resize(len);
    }

    transform(lhs.begin(), lhs.end(), rhs.begin(), lhs.begin(), op);

    return lhs;
}


vector<int>& operator+=(vector<int>& lhs, vector<int> rhs)
{
    return memberwiseAssignOp(lhs, rhs, plus<int>());
}

vector<int>& operator-=(vector<int>& lhs, vector<int> rhs)
{
    return memberwiseAssignOp(lhs, rhs, minus<int>());
}

2 个答案:

答案 0 :(得分:1)

更普遍而不仅仅是&#34;不,它不存在&#34;,有一个简单的事实,即赋值运算符的重载需要作为成员函数完成,所以它真的是无法完成。我想,因为我们所处理的并不是真正的运算符,所以可以通过编写函数来接收对象的非const引用,并将对象修改为提到的。

我一点也不确定你从中获得了很多。它产生很大差异的类型实际上是那些修改现有对象比用新值覆盖旧对象要便宜得多的类型。

曾经(在C ++ 11之前),这可能是相当多的类型。自从引入rvalue引用后,您可以通过从旧对象移动到新对象,并在整个过程中按照您认为合适的方式进行修改,从而获得大致相同的效果(但更加干净)。

理论上,可能仍有一些地方不能很好地解决问题。明显的例子是(直接)包含大量数据的对象,因此移动仍然基本上可以复制。

答案 1 :(得分:0)

以下是Functional Operations的列表。

正如您所看到的,没有赋值运算符。

您当然可以自己拥有以下功能:

a = std::plus(a, b);

但这根本没有帮助。