0

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

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 以查看之前是否有相同的数字,但它没有t 确实存在,但是里面存储的值通常很大,所以有没有可能存储 4 并且因为它,第一个数字不会被打印出来。如果是这样,如何防止它,重写代码以使其最佳?

4

3 回答 3

7

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

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

for(auto elem = mrst; elem != last; ++elem)
    outFile << *elem << " ";
于 2013-05-28T14:19:36.913 回答
4

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

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

于 2013-05-28T14:19:12.953 回答
1

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

在 c++ 中,“A || B”如果“A”没问题,则不要执行“B”。

于 2013-05-28T14:23:33.117 回答