C++ 不以 0 开头的循环

C++ Loops not starting with 0

本文关键字:循环 开头 不以 C++      更新时间:2023-10-16

所以,我一直在尝试创建一个简单的程序,只需要一个空数组和一个大小,并用从 1 到指定数字的数字填充它。

#include <iostream>
using namespace std;
int* fill(int empty[], int size) {
    int i;
    for (i = 1; i < size; i++) {
        empty[i] = i;
    }
    return empty;
}
int main() {
    int size;
    cin >> size;
    int* empty = new int[size];
    fill(empty, size); 
    for (int i = 0; i < size; i++) {
        cout << empty[i] << endl;
    }
    return 0;
}

所以,这就是我的代码。当 int i 在 fill() 方法中为 0 时,它工作得很好,但我想从 1 开始数字,当我这样做时,它看起来像这样:

-842150451
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

注意到它是如何用一个奇怪的负数替换 0 的吗?这是我输入"30"作为数组大小的时候。

当我将 i 的值设置为 0 时,它只是用 0 替换该负数。有没有办法只从一个开始数组?

谢谢。

您从索引 1 开始填充数组,然后从索引 0 开始输出它。 你期待什么?

有没有办法只从一个开始数组?

是的。 如果您需要size元素,并且出于某种原因需要它们从索引 1 开始,那么您可以分配一个额外的元素:

int* empty = new int[size + 1];

现在,您在所有后续操作中忽略元素 0*。 您还可以迭代并包括size

for (i = 1; i <= size; i++) {
    empty[i] = i;
}
  • 但是,我仍然会将其初始化为某些内容

我想警告你,如果你这样做只是因为你对零有一种非理性的恐惧,那么你应该克服这种恐惧,写出其他C++程序员可以理解的代码。 在没有充分理由的情况下从 1 开始数组是草率的,并且会惹恼任何阅读您的代码的人。

如果这只是您希望数字从 1 开始,但数组索引从零开始的问题,那就是另一回事了。 只需在填写时添加 1。

请注意,标准库中已经有一个函数。 它在<numeric>中被称为std::iota

std::iota( empty, empty + size, 1 );

怎么样?

int* fill(int empty[], int size) {
    int i;
    for (i = 0; i < size; i++) {
        empty[i] = i + 1; // one more than the index
    }
    return empty;
}

您需要将该值设置为比数组索引多 1。因此,数组索引0 - size - 1计数,而i + 1) 从1 - size计数。

如果你想让数组中的数字开始,保持循环从0开始(因为C++中的数组是从零开始的),只需将值设置为i + 1而不是简单地i

int* fill(int empty[], int size) {
    int i;
    for (i = 0; i < size; i++) {
        empty[i] = i + 1;
    }
   return empty;
}

您应该知道数组的下标从 0 开始到 size - 1 。例如:

int a[10];  // The subscript is from a[0] to a[9]

如果你想有一个大小为sz且下标从 1 开头的数组,你可以这样做

constexpr int sz = 10;
int a[sz + 1];

然后,只需使用从 1sz 的下标范围并忽略0