在不知道最后一个元素的位置的情况下,向后比较两个数组
Compare two array backwards without knowing the position of the last element
如果我有两个数组,比如
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++中NULL
或nullptr
意义上的空值。因为元素类型是int,而不是指针。当我们谈论基本类型时,只有指针可以容纳值NULL
或nullptr
。用户定义的类型是另一回事,因为它们可以自定义。
注意:使用C++时,不要使用NULL
,始终使用nullptr
。NULL
在存在过载等问题的情况下可能会导致细微的错误。
带有声明
int a[10];
有效项目设置为1到10,从一开始就连续,你会问:
">如何检查数组
a
从哪个位置开始具有有效编号?
如果
a
在名称空间范围内,则a
保证初始化为零,并且您可以搜索第一个零。请注意不要索引超出数组的末尾。std::find
为您正确地做到了这一点。否则,该标准就不能保证初始化(因为类型
int
不提供这样的保证(,并且不能以可移植的上下文无关的方式找到有效数据的末尾。但是,您仍然可以依赖上下文保证,包括编译器特定的保证。例如,当您知道a
对象已被代码归零时,您就有了上下文保证。
编辑:至少有两个人认为以上内容具有误导性,因此他们投了反对票,因为据称有人可能认为在一个给定的系统和编译器中观察到的行为是一种保证。也就是说,据称可以阅读";担保";正如";信念";,然后认为这个答案表明一个人可以依靠信仰。以上内容不应以这种重新解释来解读
关于
">我可以声明一个数组而不初始化它吗?
是的。
">如果可以,那么当我调用数组中的元素时,它是返回一些随机垃圾还是只返回null?
请参见上文。
尽管如此,请考虑使用std::vector
而不是原始数组。
它为您保持动态长度。
您可以使用Vectors,因为它足够灵活,可以访问大小,甚至可以迭代器访问最后一个元素
或者,如果您不需要访问数组中除了最后一个元素之外的所有元素,您可能需要使用Stacks,因为在堆栈的后面获取元素更容易
记住,要尝试寻找其他库,而不是坚持只使用数组,这在大多数情况下会让
- 如何在C++中比较两个char数组
- 比较两个大小不等的映射c++
- 如何比较两个同名的预处理器宏?
- C++通过数字比较两个数字
- 关于比较两个无序数组并删除 a[] 中可以在 b[] 中找到的元素的问题
- 比较两个字符串后卡在无限循环中
- 比较两个节点坐标的最佳方法是什么?
- 比较两个公钥与OpenSSL API
- 如何比较两个函数的速度和性能
- 比较两个 constexpr 指针不是 constexpr?
- 比较两个 std::chrono::time_point 实例时出错
- 比较两个没有一行共同点的大文件
- 比较两个整数在C++中与未知 int 类型的相等性
- >操作员在比较两个C++容器时会怎么做?
- 如何在 c++ 中比较两个文本文件
- 与操作员比较两个计时时间点
- 在单元测试中,如何在不使用 operator== 的情况下比较两个对象,这可能会错过新成员?
- 如何获得比较两个向量对的子集
- 如何比较两个tm(来自ctime)变量
- 比较两个std::矢量/阵列,或者通常比较两个stl连续器