我想弄清楚用std::vector<int>
值增加int
的所有元素的最佳方法是什么。
换句话说,如果我有一个带元素的向量:1 2 3 4 5
我想做点什么
vect += 5;
所以元素将是:6 7 8 9 10
。
我试图重载operator +=
但事实证明我不知道怎么做:S我试过这个:
std::vector<int> & operator += (const int & increment) {
for (int &i : *this)
*this[i] = *this[i] + increment;
}
这会编译,但每当我使用它时,我都会收到此错误:
no match for ‘operator+=’ (operand types are ‘std::vector<int>’ and ‘int’)
vec += 3;
^
有什么建议吗?我想这样做,而不是常规的increment(vector, value)
函数。
谢谢!
答案 0 :(得分:6)
不要试图改变std::vector
的行为;语言不允许这样做。
而是使用std::valarray
,它已经支持广播addition and other operations。
答案 1 :(得分:2)
您不能修改std::vector
,但从技术上讲,没有什么可以阻止您为operator+=
为向量和整数编写自己的(全局)重载:
vector<int>& operator+=(vector<int>& v, int x) {
for (auto a=begin(v); a!=end(v); ++a) {
*a += x;
}
return v;
}
但是,为std
类编写重载既不简单,也不是解决问题的规范方法。我建议改为使用std::transform
或{{1}}代替{{1}}。
答案 2 :(得分:2)
如前所述,不要尝试向std::vector
添加新功能,不允许这样做。
该标准规定,您只能打开std::
命名空间,以专门为用户定义的类型的现有模板代码。对于std :: vector,运算符为+ =,而int不是用户定义的类型。
所以你不能做你想做的事(即使它在技术上可行),这是不合法的。
相反,请使用std::transform
或std::for_each
#include <iostream>
#include <vector>
#include <algorithm>
int main(void) {
std::vector<int> v={{1,2,3,4,5}};
std::transform(std::begin(v),std::end(v),std::begin(v),[](int x){return x+5;});
for(auto e :v)
{
std::cout<<e<<std::endl;
}
return 0;
}