Алгоритм с помощью <algorithm>

167
21 марта 2018, 05:35

Я реализовал алгоритм по получению нового массива из старого. И мне хотелось бы получить такой же результат но используя функционал библиотеки <algorithm>. Но я так и не смог найти ничего подходящего, смотрел sort, transform, merge, replace_if и др.

int nums[] = {1, 20, 1, 2, 3, 16};
vector<int> vec(nums, nums+6);
vector<int> newArr;
int n = 0;
for(int i = 0; i < vec.size(); i++)
{
    if(vec[i] < vec[i+1])
        newArr.push_back(vec[i]);
    else
    {
        vec[i+1] = vec[i] - vec[i+1];
    }
}

На выходе получаю [1, 14, 16]

Answer 1

Давно не трогал плюсы. Вот мой вариант.

#include <iostream>
#include <vector>
#include <numeric>
std::vector<int>& Reduce(std::vector<int>& acc, int &value){    
    if(acc.empty() || acc.back() < value){        
        acc.push_back(value);
    }else{
        acc.back() -= value;
    }
    return acc;
}
int main()
{
    std::vector<int> arr {1, 20, 1, 2, 3, 16};
    std::vector<int> result = std::accumulate(arr.begin(), arr.end(), std::vector<int>{}, Reduce);    
    for(auto i: result){
        std::cout << i << std::endl;
    }
}
Answer 2

Не знаю насколько я правилно понел что вы хотите делать, но насколько понел...

vector<int> v1{2, 5, 3, 7, 16, 5};
vector<int> res(v1.size());
generate(res.begin(), res.end(),
             [v1]() { static auto It = v1.begin();
        if(It != v1.begin() && *(It -1) > *It)
            return  *(It - 1) - *It++;
        else   return *It++; } );

res будет новой желаемой последовательностью

а если у вас массив на входе, то можно данные брать из прямо массива:

const int N = 6;
int v1[N]  = {2, 5, 3, 7, 16, 5};
vector<int> res;
generate_n(back_inserter(res), N,
              [v1]() { static const int* It = v1;
          if(It != v1 &&  *(It -1) > *It )
            return  *(It - 1) - *It++;
          else   return *It++;  } );
READ ALSO
Как работает ссылка?

Как работает ссылка?

Друзья, помогите джуну в C++! Когда пишем

209
Работа с бинарным деревом

Работа с бинарным деревом

Дано бинарное дерево,рандомно было записано данныеДалее необходимо удалить все простые числа

197