Заполнение массива в порядке убывания c ++ НЕ сортировка

Я пытаюсь сгенерировать массив в порядке убывания, как на самом деле заполнить его с нуля. Я не пытаюсь сортировать данные числа. Я хотел знать, есть ли способ сделать это без цикла for. Я смог сгенерировать массив в порядке возрастания чисел, используя std :: iota, но я не смог (и не думаю, что смогу) использовать его для генерации убывающего массива. Есть ли один вкладыш для генерации массива размера в порядке убывания?

РЕДАКТИРОВАТЬ:
Мне удалось создать массив в порядке возрастания, используя:

    void generateAscendingArray(int values[], size_t size){
std::iota(values, values+size, 1);
}

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

1

Решение

Самым простым решением может быть использование std::iota но, чтобы заполнить ваш массив сзади вперед. использование std::rbegin а также std::rend чтобы получить обратные итераторы, которые повторяют в обратном порядке:

#include <array>
#include <iostream>
#include <iterator>
#include <numeric>

int main()
{
std::array<int, 10> my_data;
std::iota(std::rbegin(my_data), std::rend(my_data), 0);
for (auto value : my_data) {
std::cout << value << ' ';
}
std::cout << std::endl;
return 0;
}

Выход :

9 8 7 6 5 4 3 2 1 0

Редактировать: кажется, что вы используете указатель на первый элемент массива и размер вместо использования надлежащего объекта контейнера. В таком случае, std::rbegin а также std::rend не может определить размер указанного массива, используя только указатель. Вам нужно будет создать обратные итераторы вручную, как это сделано в foo в следующем примере:

#include <array>
#include <iostream>
#include <iterator>
#include <numeric>

void foo(int * data, size_t size) {
std::reverse_iterator<int*> first(data + size);
std::reverse_iterator<int*> last(data);
std::iota(first, last, 0);
}

int main()
{
int my_data[10];

foo(my_data, sizeof(my_data) / sizeof(*my_data));

for (auto value : my_data) {
std::cout << value << ' ';
}
std::cout << std::endl;
return 0;
}

Тем не менее, в качестве контейнеров вы бы предпочли использовать рваные массивы в пользу стандартных контейнеров, таких как std::vector или используя итераторы для выражения диапазонов элементов.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]