STL способ добавить постоянное значение в std :: vector - PullRequest
34 голосов
/ 16 декабря 2010

Есть ли в стандартной библиотеке алгоритм, который может добавлять значение к каждому элементу std :: vector? Что-то вроде

std::vector<double> myvec(5,0.);
std::add_constant(myvec.begin(), myvec.end(), 1.);

что добавляет значение 1.0 к каждому элементу?

Если нет хорошего (например, короткого, красивого, удобного для чтения) способа сделать это в STL, как насчет повышения?

Ответы [ 5 ]

47 голосов
/ 16 декабря 2010

Еще короче, используя лямбда-функции, если вы используете C ++ 0x:

std::for_each(myvec.begin(), myvec.end(), [](double& d) { d+=1.0;});
36 голосов
/ 16 декабря 2010

Взгляните на std::for_each и std::transform. Последний принимает три итератора (начало и конец последовательности и начало выходной последовательности) и объект функции. Есть несколько способов написать это. Один из способов, используя только стандартные вещи:

transform(myvec.begin(), myvec.end(), myvec.begin(),
          bind2nd(std::plus<double>(), 1.0));              

Вы также можете сделать это с for_each, но поведение по умолчанию std::plus не запишет ответ обратно в исходный вектор. В этом случае вы должны написать свой собственный функтор. Вот простой пример:

struct AddVal
{
    double val;
    AddVal(double v) : val(v);

    void operator()(double &elem) const
    {
        elem += v;
    }
};

std::for_each(myvec.begin(), myvec.end(), AddVal(1.0));
12 голосов
/ 25 сентября 2011

Кратчайший путь в простом C ++ 0X:

for(double& d : myvec)
  d += 1.0;

и с наддувом:

for_each(myvec, _1 += 1.0); // boost.range + boost.lambda
9 голосов
/ 16 декабря 2010
std::transform( myvec.begin(), myvec.end(), 
                myvec.begin(), std::bind2nd( std::plus<double>(), 1.0 ) );
5 голосов
/ 24 сентября 2011

Если вы заинтересованы в выполнении большого количества математических заданий для векторов, вам может понадобиться заглянуть в часть <valarray> стандартной библиотеки.В основном это std::vector<>, предназначенный для векторных числовых вычислений (срезы, математические функции, точечные операторы и т.1007 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...