如果我有两个数组,例如
<lib>
但是,我没有数组int a[10];
int b[5]={1,3,5,7,9};
中有多少个元素。我的意思是数组a
的大小是10,但是a
可以包含1到10之间的任意数量的元素。我想向后比较这两个数组。那么如何检查数组a
在哪个位置开始有一个有效数字呢?
另一个问题是我可以在不初始化的情况下声明数组吗?如果我可以,那么当我调用数组中的元素时,它会返回一些随机垃圾还是只返回null?
答案 0 :(得分:2)
使用一些已知的整数(比如-1)初始化数组(数组的所有元素),然后遍历它(修改后的索引的值不是-1),直到遇到-1。这只是暂时的解决方案。因为-1也是有效的整数,它可能不是问题的确切解决方案。 我真的希望得到SO专家更好的解决方案。 快乐的编码
答案 1 :(得分:0)
您必须首先找到第一个有效位置。这是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));
这使用了c ++ 14免费函数用于迭代器和std::equal
中的改进,它检查大小并且不会导致未定义的行为,这与旧的3-legged std::equal
算法不同。
关于从单元化数组返回:它将返回随机数据,但不是C ++中NULL
或nullptr
意义上的空值。因为元素类型是int,而不是指针。当我们谈论基本类型时,只有指针可以包含值NULL
或nullptr
。用户定义的类型是另一个故事,因为它们可以自定义。
P.S。:使用C ++时,请勿使用NULL
,始终使用nullptr
。 NULL
可能会在出现超载等问题时导致细微的错误。
答案 2 :(得分:0)
声明
int a[10];
并且有效项目从一开始就连续设置为1到10,您会问:
“如何查看数组
a
开始拥有有效数字的位置?
如果a
位于命名空间范围内,则a
保证为零初始化,您可以搜索第一个零。注意不要超出数组末尾的索引。 std::find
为您正确执行此操作。
否则标准不保证初始化(因为类型int
没有提供这样的保证),并且无法在便携式上下文中找到有效数据的结尾办法。但是,您仍然可以依赖上下文保证,包括特定于编译器的保证。例如,当您知道代码已将a
对象清零时,您将获得上下文保证。
编辑:至少有两个人发现上述内容如此具有误导性,以至于他们已经投票,因为据称有人可能认为观察到的行为与一个给定的系统和编译器是一种保证。据说,它有可能将“保证”视为“信仰”,然后认为这个答案表明人们可以依赖信仰。不应该通过这种重新解释来阅读上述内容。
关于
“我可以在不初始化的情况下声明数组吗?
是
“如果可以,那么当我调用数组中的元素时,它会返回一些随机垃圾还是只返回null?
见上文。
所有这些都说,请考虑使用 std::vector
而不是原始数组。
它为您保持动态长度。
答案 3 :(得分:0)