一、去重函数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;
}

注释即解释。

以上 ?

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐