超简单的C++去重、排序

  • Post author:
  • Post category:其他


一、去重函数

unique


头文件



algorithm

,所以别忘了加上一句:

#include <algorithm>


unique

的作用就是

"去除"

数组中重复的元素

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
	int a[10] = { 0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };

	int n = unique(a, a + 10) - a;
	
	cout << n << endl;        // 7
	
	for (int i = 0; i < 10; i++)
		cout << a[i] << " ";  // 0 7 6 1 5 8 9 5 8 9

	return 0;
}

可以看见最后三个元素是:

5 8 9

,而重复的数字是

1 5 7

,所以网上有种说法:“

unique去重的过程是将重复的元素移到容器的后面去




是不对的




上面的

n

返回的是

7

,它就是:

最后一个不重复数字的下标



所以,把上面的

for

循环改成:

for (int i = 0; i < n; i++)
	cout << a[i] << " ";  // 0 7 6 1 5 8 9



i < n

就是只输出前面不重复的数字,这样就实现的去重的效果。




二、去重函数

unique

与排序函数

sort

结合

如果不了解

排序函数sort

,可以参考文章:

C++排序函数sort

如果先

去重



排序

那么结果就是:去重毫无作用。因为

去重



排序

排序时会把重复的数字又放在了一起,所以要先

排序



去重

。这点应该好理解,这里提一下。



排序



去重

代码如下:

#include <iostream>
#include <algorithm>   // sort(), unique()
#include <functional>  // less<int>()

using namespace std;

int main()
{
    int i;
    int a[10] = { 0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };

	sort( a, a + 10, less<int>() );  // 排序

    int n = unique(a, a + 10) - a;   // 去重

    for ( i = 0; i < n; i++)  // 注意i < n
        cout << a[i] << " ";  // 0 1 5 6 7 8 9
}

于是就得到了想要的结果:

去掉重复数字,再把数字排序




三、不用去重函数

unique

,手撸去重

虽然手撸去重代码有点多,显得有点low,但是不依赖库函数,自己实现,也能锻炼一下自己吧!


两种思路:


一是:将不重复的元素存入另一个数组,再输出。

二是:将重复的元素值置为

0 或 -1 或 其他标记值

,然后输出时,只输出标记值以外的值。


思路一:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int i = 0, j = 0;
    const int len = 10; // 数组的长度
    int p[len] = { 0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };
    int t[len] = {0};   // 储存排序后的数组
    int counter = 1;    // 记录t数组中存了多少元素

    sort(p, p + len);   // 排序

    t[0] = p[0];
    // 去重
    while (i < len) {
        if (p[i] != p[++j]) {
            i = j;
            t[counter++] = p[i]; // 不重复的存入t数组,然后counter加一
        }
    }
    
    // 输出
    for (i = 0; i < (counter-1); i++) // counter-1就是t数组中存的元素个数
        cout << t[i] << " ";          // 0 1 5 6 7 8 9

    return 0;
}

核心的

去重

代码就是:

//i,j初始值都为0,counter初始值为1,len值为10
t[0] = p[0];

while (i < len) {
    if (p[i] != p[++j]) {
        i = j;
        t[counter++] = p[i];
    }
}

意思是:从数组中

下标为0的元素

开始向后比较,遇到重复元素忽略,遇到不同元素,就把这个不同元素存入 t 数组,同时再

从刚才那个不同元素下标处开始继续向后比较

,以此类推。

这行代码:

t[0] = p[0];

无论数组中

下标为0的元素



后面的元素

重不重复都要加,这是因为

while循环



比较元素

后面的

不同元素

存入 t 数组,所以

下标为0的元素

永远不会被存入,直接手动加上就行了。


思路二:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int i = 0, j = 0;
    const int len = 10; // 数组的长度
    int p[len] = { 0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };

    sort(p, p + len);   // 排序

    // 去重
    while (i < len) {
        if (p[i] == p[++j]) { // 遇到重复元素,将其值置为-1
            p[j] = -1;        // -1是标记值,可以换成其他值,但不能和要排序的数字冲突
        } else {
            i = j;
        }
    }

    // 输出
    for (i = 0; i < len; i++)
        if (p[i] != -1) // 只输出非标记元素
            cout << p[i] << " ";  //0 1 5 6 7 8 9

    return 0;
}

注释即解释。

以上 ?


(486条消息) 超简单的C++去重、排序_EvanOne(文一)的博客-CSDN博客_c++ 去重