c++如何删除一个数组中的重复元素

 我来答
问明6E
高粉答主

2019-06-26 · 每个回答都超有意思的
知道答主
回答量:279
采纳率:100%
帮助的人:12.6万
展开全部

方法一、

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"

四舍五不入6
高粉答主

2020-03-17 · 醉心答题,欢迎关注
知道答主
回答量:147
采纳率:100%
帮助的人:2.1万
展开全部

整型数组为例,参考代码如下:

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++

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风若远去何人留
推荐于2017-09-07 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450111
专业C/C++软件开发

向TA提问 私信TA
展开全部

可以使用双重循环,逐一对比元素,如有重复,则删除的方法去重。

其思路为

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; //返回新的长度。
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
huanmiewh
推荐于2017-09-28 · TA获得超过277个赞
知道小有建树答主
回答量:178
采纳率:100%
帮助的人:98.7万
展开全部

如果是使用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
哭😭😭😭
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
laughlee7468
2014-03-16 · TA获得超过2004个赞
知道小有建树答主
回答量:541
采纳率:100%
帮助的人:671万
展开全部
#include <stdio.h>
#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]);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式