c++如何删除一个数组中的重复元素
方法一、
vector<int> sun;
//向sun添加元素
for (int i = 0; i < n; ++i)
{
sun.push_back(primes[i]);
}
sort(sun.begin(), sun.end());
//使用 erase 删除
sun.erase(unique(sun.begin(), sun.end()), sun.end());
earse的功能是删除指定范围内的所有函数;unique将相邻的重复的元素移到最后。
方法二、
排序函数(sort)和去重函数都在<algorithm>头文件中。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> v;
cout << "Number of vector's element : " << endl;
int number;
cin >> number;
for (int i = 0; i < number; i++) {
int temp;
cin >> temp;
v.push_back(temp);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(), v.end()), v.end());
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
return 0;
}
unique()函数将重复的元素放到vector的尾部然后返回指向第一个重复元素的迭代器再用erase函数擦除从这个元素到最后元素的所有的元素.
扩展资料:
return的用法:
return的作用是结束正在运行的函数,并返回函数值。return后面可以跟一个常量,变量,或是表达式。
1、函数的定义一般是这样的,例如:
inta(inti)第一个int是函数的返回值的类型,也就是return后面跟的值的类型,a是函数的名称,括号里的是传递给函数的参数,int是参数的类型,i是参数的名字
{
.../省略函数体内容
returnb;//b必须与函数头的返回值一致(此处为int型)
}
2、简单函数举例:
intaddOne(intb)
{
returnb+1;
}
该函数的作用是取得一个数,将这个数加上1,再将结果返回。
3、调用时:
intresult=addOne(2);//此时result的值为3
函数括号里的参数也可以为变量或能算出值的表达式
以上就是一个基本的函数,一般的函数都有返回值,也就是return后面跟的值,返回值可以为各种数据类型,如:int,float,double,char,a[](数组),*a(指针),结构或类(c++)
但不是所有函数都有返回值,如果某个函数无返回值,那么返回值的位置则为“void”关键字,此时函数体中无返回值,即无return的值。但是函数中也可出现return,即一个空的return句子,其作用是使函数立即结束,如voidprint()//括号中为空表示无传递参数、
{
printf("a");
printf("b");
return;//函数执行到此处结束
printf("c");
}//该函数只执行到return语句处,即屏幕上输出的为"ab"
以整型数组为例,参考代码如下:
int remove_repeat(int *a, int l)//对起始地址为a,长度为l的数组进行去重,新的长度以返回值形式返回。
{
int i,j, r=0; //i,j为循环下标,r为去重后元素总数,初始值为0
for(i = 0; i < l; i ++)
{
for(j = 0; j < r; j ++)//检查是否重复
if(a[j] == a[i]) break;
if(j == r) //没有重复元素
a[r++] = a[i]; //将当前元素放置与去重后数组的尾部,并增加去重后的总数。
}
return r; //返回新的长度。
}
扩展资料:
c++关键字
if,else
条件语句的组成部分。if表示条件,之后else表示否定分支。
enum
构成枚举类型名的关键字。C++11新增带作用域的枚举,用enum class或enum struct(两者等价)声明。
explicit
这个关键字修饰构造函数声明,表示显式构造函数(模版),显式构造函数不参与特定的重载。
mutable
用于类的非静态非const数据成员,表示不受到成员函数的const的限制,可以在const成员函数中使用。
operator
和操作符连用,指定一个重载了的操作符函数,也包括operator new和operator delete。
参考资料来源:百度百科-C++
可以使用双重循环,逐一对比元素,如有重复,则删除的方法去重。
其思路为
1、依次遍历循环中的每一个元素。
2、对于任意一个元素,依次与之前的元素进行对比,如果有重复则删除。
3、删除操作可以采用将后续元素逐个前移,达到覆盖当前元素的效果。
在此基础上可以进行一点优化,即,不需要每次删除元素均前移所有元素,而是把需要保留的元素放到"应该"放的位置即可,这样可以提高效率。
以整型数组为例,参考代码如下:
int remove_repeat(int *a, int l)//对起始地址为a,长度为l的数组进行去重,新的长度以返回值形式返回。
{
int i,j, r=0; //i,j为循环下标,r为去重后元素总数,初始值为0
for(i = 0; i < l; i ++)
{
for(j = 0; j < r; j ++)//检查是否重复
if(a[j] == a[i]) break;
if(j == r) //没有重复元素
a[r++] = a[i]; //将当前元素放置与去重后数组的尾部,并增加去重后的总数。
}
return r; //返回新的长度。
}
如果是使用STL的话,可以参考如下代码:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int> buf(5, 2);
for (int i = 0; i < 5; i++)
buf.push_back(rand());
// 上面一段是为了生成测试数据
// vector<int>::iterator 这个是定义了个迭代器
vector<int>::iterator it;
// 输出去重之前的元素
for (it = buf.begin(); it != buf.end(); it++)
cout << *it << " ";
cout << endl;
// 先对数据进行排序(必须的)
sort(buf.begin(), buf.end());
// unique()函数就是去重用的
// 去重原理:找到重复的数据后移动到最后,然后返回第一个重复的元素的地址
it = unique(buf.begin(), buf.end());
// 删掉重复的元素
buf.erase(it, buf.end());
// 输出去重后的元素
for (it = buf.begin(); it != buf.end(); it++)
cout << *it << " ";
cout << endl;
}
// 以上就是利用STL的方法
如果不是使用STL的话,只是对某个数组进行去重的话,可以参考这个过程:
1、进行排序(依然可以调用sort())
2、对比相邻两个元素,相同就删掉一个
不懂stl
哭😭😭😭
#define N 1000
#define FLAG 0x80000000 /*特殊标记,用最小的负数表示*/
void main( )
{
int r[N], length, i, j;
scanf("%d", &length);
for(i = 0; i < length; i++)
scanf("%d", &r[i]);
for(i = 0; i < length - 1; i++)
{
if(r[i] != FLAG)
{
for(j = i + 1; j < length; j++)
if(r[j] == r[i]) r[j] = FLAG; /*遇到重复值,则先用特殊标记覆盖它*/
}
}
for(i = 0; r[i] != FLAG; i++); /*找到第一个特殊标记*/
for(j = i + 1; j < length;) /*删除数列中的特殊标记*/
{
if(r[j] != FLAG) r[i++] = r[j++];
else j++;
}
length = i; /*修改删除重复值后的数列的长度*/
for(i = 0; i < length; i++)
printf("%-4d", r[i]);
}