Я пытаюсь сгенерировать массив в порядке убывания, как на самом деле заполнить его с нуля. Я не пытаюсь сортировать данные числа. Я хотел знать, есть ли способ сделать это без цикла for. Я смог сгенерировать массив в порядке возрастания чисел, используя std :: iota, но я не смог (и не думаю, что смогу) использовать его для генерации убывающего массива. Есть ли один вкладыш для генерации массива размера в порядке убывания?
РЕДАКТИРОВАТЬ:
Мне удалось создать массив в порядке возрастания, используя:
void generateAscendingArray(int values[], size_t size){
std::iota(values, values+size, 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
или используя итераторы для выражения диапазонов элементов.
Других решений пока нет …