+ =在没有增强的矢量上

时间:2010-08-07 02:15:15

标签: c++ boost stl vector operator-overloading

有没有办法在不使用boost或使用派生类的情况下将+ =运算符与向量一起使用?

例如

somevector += 1, 2, 3, 4, 5, 6, 7;

实际上是

somevector.push_back(1);
somevector.push_back(2);
somevector.push_back(3);
etc.

2 个答案:

答案 0 :(得分:14)

有一点丑陋的运算符重载,这不是很难实现。这个解决方案很容易变得更通用,但它应该是一个充分的例子。

#include <vector>

您需要的语法使用两个运算符:+=运算符和,运算符。首先,我们需要创建一个包装类,允许我们应用,运算符将元素推送到向量的背面:

template <typename T>
struct push_back_wrapper
{
    explicit push_back_wrapper(std::vector<T>& v) : v_(&v) { }

    push_back_wrapper& operator,(const T& x)
    {
        v_->push_back(x);
        return *this;
    }

    std::vector<T>* v_;
};

然后,为了在向量上与+=结合使用,我们会为向量重载+=运算符。我们返回一个push_back_wrapper实例,以便我们可以使用逗号运算符链接回推:

template <typename T, typename U>
push_back_wrapper<T> operator+=(std::vector<T>& v, const U& x)
{
    v.push_back(x);
    return push_back_wrapper<T>(v);
}

现在我们可以编写示例中的代码:

int main()
{
    std::vector<int> v;
    v += 1, 2, 3, 4, 5, 6, 7;
}

v += 1将调用我们的operator+=重载,该重载将返回push_back_wrapper的实例。然后,为“list”中的每个后续元素应用逗号运算符。

答案 1 :(得分:5)

没有这样的语法,没有。但你可以这样做:

int tmparray[] = {1, 2, 3, 4, 5, 6, 7};

somevector.insert(somevector.end(), 
                  tmparray, 
                  tmparray + (sizeof(tmparray) / sizeof(tmparray[0])));