将所有C ++ std :: vector值递增一个常量值

时间:2014-01-30 09:20:10

标签: c++ vector

我想弄清楚用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)函数。

谢谢!

3 个答案:

答案 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;
}

演示:http://ideone.com/kKXnWS

但是,为std类编写重载既不简单,也不是解决问题的规范方法。我建议改为使用std::transform或{{1}}代替{{1}}。

答案 2 :(得分:2)

如前所述,不要尝试向std::vector添加新功能,不允许这样做。 该标准规定,您只能打开std::命名空间,以专门为用户定义的类型的现有模板代码。对于std :: vector,运算符为+ =,而int不是用户定义的类型。

所以你不能做你想做的事(即使它在技术上可行),这是不合法的。

相反,请使用std::transformstd::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;
}