有没有办法在不使用boost或使用派生类的情况下将+ =运算符与向量一起使用?
例如
somevector += 1, 2, 3, 4, 5, 6, 7;
实际上是
somevector.push_back(1);
somevector.push_back(2);
somevector.push_back(3);
etc.
答案 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])));