按降序填充数组 C++ 不排序
Populating an array in descending order c++ NOT sorting
我正在尝试按降序生成一个数组,实际上是从头开始填充它。我不是要对给定的数字进行排序。我想知道是否有没有 for 循环的方法。我能够使用 std::iota 按数字升序生成数组,但我无法(我认为我也不能)使用它来生成降序数组。是否有一个用于按降序生成大小数组的衬垫?
编辑:
我能够使用以下命令按升序创建数组:
void generateAscendingArray(int values[], size_t size){
std::iota(values, values+size, 1);
}
所以它用对应于数组大小的数字填充数组。我只是在寻找一种简单的方法来生成一个没有循环的降序数组,或者用最少的行和工作,类似于升序。我希望它按照数组的大小按降序填充数组。
最简单的解决方案可能是使用 std::iota
but to fill your array from back to front. Use std::rbegin
and 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
等标准容器,或者使用迭代器来表示元素的范围。
我正在尝试按降序生成一个数组,实际上是从头开始填充它。我不是要对给定的数字进行排序。我想知道是否有没有 for 循环的方法。我能够使用 std::iota 按数字升序生成数组,但我无法(我认为我也不能)使用它来生成降序数组。是否有一个用于按降序生成大小数组的衬垫?
编辑: 我能够使用以下命令按升序创建数组:
void generateAscendingArray(int values[], size_t size){
std::iota(values, values+size, 1);
}
所以它用对应于数组大小的数字填充数组。我只是在寻找一种简单的方法来生成一个没有循环的降序数组,或者用最少的行和工作,类似于升序。我希望它按照数组的大小按降序填充数组。
最简单的解决方案可能是使用 std::iota
but to fill your array from back to front. Use std::rbegin
and 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
等标准容器,或者使用迭代器来表示元素的范围。