вывод массива после сортировки

197
23 февраля 2018, 18:30
vector<int> a;
sort(a.begin(), a.end());
copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));

Допустим, если в векторе числа лежат числа 10 5 2, то сортировка выдаст мне 2 5 10. Как сделать так, чтобы он мне вывел 3 6 11 без изменения самих чисел в векторе? Если в цикле через i+1 то тут как?

Answer 1

Для этого нужен свой итератор или диапазон. Можно использовать rangev3:

std::array<int, 3> array = {1, 5, 4};
ranges::sort(array);
auto range_view = ranges::view::transform(array, [](int i){return i + 1;});
std::copy(range_view.begin(), range_view.end(), std::ostream_iterator<int>(std::cout, " "));
Answer 2

достаточно после сортировки добавить одну строку

 transform(a.begin(), a.end(), a.begin(), [](int i) {return ++i;});

но если вы не хотите менять данные в векторе, то можно впихать в другую последовательность

vector<int> v(3);
transform(a.begin(), a.end(), v.begin(), [](int i) {return ++i;});
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));

еще один вариант

struct incr {
    std::vector<int> v;
    incr(const std::vector<int>& res) : v(res) {}
    int operator ()() {
        static auto I = v.begin();
        *I += 1;
        return *I++;
    }
};
int main()
{    
    std::vector<int> a{2, 5, 7};
    std::sort(a.begin(), a.end());
    std::generate_n(ostream_iterator<int>(cout, " "), 3, incr(a));
    return 0;
}

и так можно придумать много вариантов

READ ALSO
Как сделать подсчет очков в игре?

Как сделать подсчет очков в игре?

Как сделать подсчет очков по удаляемым линиям? Допустим убралась линия - плюс 40 очковПишу в Visual Studio 2017

420
Чем чревато закрытие программы через taskkill?

Чем чревато закрытие программы через taskkill?

Я хочу отловить момент, когда приложение пытаются закрыть и убить процесс своей же программы через taskkillСделать я это хочу, потому что при...

264
Проверить попадает ли точка в заданную область

Проверить попадает ли точка в заданную область

Есть 2 действительных числа, x и y, которые вводятся с клавиатурыНужно проверить попадет ли точка в заданную область, область это рисунок

202