在不知道最后一个元素的位置的情况下,向后比较两个数组

Compare two array backwards without knowing the position of the last element

本文关键字:比较 两个 数组 最后一个 不知道 元素 位置 情况下      更新时间:2023-10-16

如果我有两个数组,比如

int a[10];
int b[5]={1,3,5,7,9};

但是,我不知道数组a中有多少个元素。我的意思是数组a的大小是10,但a可以包含1到10之间的任何数量的元素。我想向后比较这两个数组。因此,我如何检查数组a在哪个位置开始具有有效数字?

另一个问题是,我可以在不初始化数组的情况下声明它吗?如果可以的话,那么当我调用数组中的元素时,它是返回一些随机垃圾还是只返回null?

用一些已知的整数(比如-1(初始化数组(数组的所有元素(,然后对其进行迭代(修改后的索引将具有除-1之外的值(,直到遇到-1。这只是暂时的解决办法。因为-1也是有效的整数,它可能不是问题的确切解决方案。我真的很想从SO的专家那里得到更好的解决方案。快乐编码

您必须首先找到第一个有效位置。这是c++14:

auto valid_pos = std::find_if(std::crbegin(a), std::crend(a), [](int val) { /*your predicate*/ });
bool are_equal = std::equal(std::crbegin(b), std::crend(b), valid_pos, std::crend(a));

与旧的3列std::equal算法不同,这是在使用c++14自由函数进行迭代器,并改进了std::equal,它可以检查大小,不会导致未定义的行为。

关于从单元化数组返回:它将返回随机数据,但不会返回C++中NULLnullptr意义上的空值。因为元素类型是int,而不是指针。当我们谈论基本类型时,只有指针可以容纳值NULLnullptr。用户定义的类型是另一回事,因为它们可以自定义。

注意:使用C++时,不要使用NULL,始终使用nullptrNULL在存在过载等问题的情况下可能会导致细微的错误。

带有声明

int a[10];

有效项目设置为1到10,从一开始就连续,你会问:

">如何检查数组a从哪个位置开始具有有效编号?

  • 如果a在名称空间范围内,则a保证初始化为零,并且您可以搜索第一个零。请注意不要索引超出数组的末尾。std::find为您正确地做到了这一点。

  • 否则,该标准就不能保证初始化(因为类型int不提供这样的保证(,并且不能以可移植的上下文无关的方式找到有效数据的末尾。但是,您仍然可以依赖上下文保证,包括编译器特定的保证。例如,当您知道a对象已被代码归零时,您就有了上下文保证。

编辑至少有两个人认为以上内容具有误导性,因此他们投了反对票,因为据称有人可能认为在一个给定的系统和编译器中观察到的行为是一种保证。也就是说,据称可以阅读";担保";正如";信念";,然后认为这个答案表明一个人可以依靠信仰。以上内容不应以这种重新解释来解读

关于

">我可以声明一个数组而不初始化它吗?

是的。

">如果可以,那么当我调用数组中的元素时,它是返回一些随机垃圾还是只返回null?

请参见上文。


尽管如此,请考虑使用std::vector而不是原始数组。

它为您保持动态长度。

您可以使用Vectors,因为它足够灵活,可以访问大小,甚至可以迭代器访问最后一个元素

或者,如果您不需要访问数组中除了最后一个元素之外的所有元素,您可能需要使用Stacks,因为在堆栈的后面获取元素更容易

记住,要尝试寻找其他库,而不是坚持只使用数组,这在大多数情况下会让

变得更容易