unique
头文件:algorithm
,所以别忘了加上一句:#include
unique
的作用就是"去除"
数组中重复的元素
#include
#include
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
#include // sort(), unique()
#include // less()
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
#include
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
#include
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;
}
注释即解释。
以上 ?