一、去重函数
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
就是只输出前面不重复的数字,这样就实现的去重的效果。
如果不了解
排序函数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
}
于是就得到了想要的结果:
去掉重复数字,再把数字排序
虽然手撸去重代码有点多,显得有点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;
}
注释即解释。
以上 ?