从 1 开始数组是错误的吗?

is it wrong to start an array from 1?

提问人:Lauraa 提问时间:3/5/2022 更新时间:3/5/2022 访问量:88

问:

我需要解决一个 c++ 问题,但有些东西不起作用,我不知道为什么。

给出 N 个数字,以 k 个序列划分。我需要找出哪些序列是相等的,知道 k 除以 n。 是一些值的问题作为示例:这是一些值的问题作为示例。(罗马尼亚语)

我尝试了这样的事情:

#include <bits/stdc++.h>
using namespace std;
bool compare(int a[], int b[], int n)
{
    for(int i=1;i<=n;i++)
        if(a[i]!=b[i])
            return false;
    return true;
}
int main()
{
    int n, k;
    int i, j, secv;
    cin>>n>>k;
    int flag=1, v[n];
    for(i=1;i<=n;i++)
        cin>>v[i];
    secv=n/k;
    for(i=1;i<k && flag==1;i++)
        for(j=i+1; j<=k && flag==1; j++)
            if(compare(v+i*secv, v+j*secv, secv)==true)
                {
                    cout<<i<<" "<<j;
                    flag=0;
                }
    if(flag==1) cout<<"NU";
    return 0;
    

}
C++ 数组 序列

评论

3赞 user4581301 3/5/2022
几乎总是,是的。C++ 中几乎所有的东西都是原点0。
4赞 Vlad from Moscow 3/5/2022
@Lauraa 像这样的可变长度数组 int flag=1, v[n];不是标准的 C++ 功能。请改用 std::vector<int>
1赞 Vlad from Moscow 3/5/2022
@Lauraa 这个循环for(i=1;i<=n;i++) cin>>v[i];Invikes 未定义的行为,因为索引的有效范围为 [0, n]
3赞 user4581301 3/5/2022
结合 .是搬起石头砸自己的脚的快速方法。C++ 标准库中有数以万计的标识符,这种组合包括所有这些标识符,并将它们与您在全局命名空间中拥有的任何标识符发生冲突,在那里它们可能会给您带来非常令人讨厌的惊喜。#include <bits/stdc++.h>using namespace std;
2赞 user4581301 3/5/2022
C++ 是一种极其复杂的语言,因此更喜欢从旨在像一套好书一样教学的材料中学习 C++。一旦你学会了语言基础知识,就开始为乐趣或利润而竞争。

答:

3赞 Rupakshi 3/5/2022 #1

如果你的数组大小,并且你正在迭代索引处的第一个元素,那么有两个问题:k1

  • 您的数组将只能保存元素,因为在内存中,数组的第一个元素位于索引处。k-10

  • 一些默认数组函数(如 和 )将包含 0 索引,因此它可能会产生意外结果。beginsize

数组如何保存在 memeory 中数组名称只是连续内存引用的占位符。因此,如果你从数组开始,那么你就跳过了第一个索引。1

最佳做法是启动索引为 0 的数组。