【问题标题】:c++ ignoring same number in an arrayc ++忽略数组中的相同数字
【发布时间】:2013-05-28 14:16:19
【问题描述】:

我有一个随机数数组,例如

6 5 4 4 8

我需要对其进行排序并在之后打印时删除/忽略相同的数字,所以我所做的是我使用 bubble sorth algorithm 对所有内容进行排序并得到类似的结果

4 4 5 6 8

现在为了只打印不同的数字,我写了这个for loop

for(int i=0;i<n;i++){
    if(mrst[i]!=mrst[i-1] && mrst[i]>0){
        outFile << mrst[i] << " ";
    }
}

我的问题是,我拥有的数组在 [0:12] 的间隔内,虽然我第一次调用它时,它会检查数组索引 -1 以查看之前是否有相同的数字,但是它实际上并不存在,但是其中存储的值通常很大,所以有可能存储 4 并且因此不会打印出第一个数字。如果是这样,如何防止它,重写代码使其最优?

【问题讨论】:

  • 你不能在数组之前取消引用(不存在的)元素,你正在调用未定义的行为。

标签: c++ arrays loops for-loop


【解决方案1】:

也许,您正在寻找std::unique 算法:

std::sort(mrst, mrst + n);
auto last = std::unique(mrst, mrst + n);

for(auto elem = mrst; elem != last; ++elem)
    outFile << *elem << " ";

【讨论】:

  • 这看起来很有趣,我会试一试,虽然 Joey 的解决方案似乎更简单易行
【解决方案2】:

好吧,正如你已经指出的那样,你不能检查mrst[i] != mrst[i-1] 以防i == 0所以我相信你可以想出一个的方法> 进行检查正是在这种情况下 ...(这看起来很像家庭作业,所以我不太愿意给你一个完整的解决方案,但我想我已经暗示得够多了)

另请注意,访问数组边界之外的内存是未定义的行为,因此您在那里所做的事情可以做任何事情,从正常工作到使程序崩溃,完全由编译器决定。

【讨论】:

  • 感谢提示,有时解决方案可能很简单,只是不被注意到,谢谢
【解决方案3】:

基本上你可以从堆中的任何地方读取。所以 mrst[-1] 可能会给你一些内存垃圾。但是你真的应该避免这样做。在您的情况下,您可以将“mrst[i]!=mrst[i-1] && mrst[i]>0”更改为“i==0 || mrst[i]!=mrst[i-1]”。

在 c++ 中,“A || B”如果“A”正常,则不要执行“B”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-06
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多