删掉重复的数据

51 篇文章 3 订阅
28 篇文章 0 订阅

一)过滤重复的数据。即把原来重复的数据过滤,只保留一份。

例如:int a[]={1,3,4,3,2,5,2};
输出:1 3 4 2 5

①实现方法一(采用STL):

#include <iostream>
#include <algorithm>   
#include <set>

using namespace std;

void Dedup(FILE* infile,FILE* outfile)
{
	int iTemp;
	unsigned int nCount = 0;

	typedef set<int> IntSet;
	IntSet iArray;

	while(NULL == feof(infile))
	{
		fscanf(infile,"%d",&iTemp);
		iArray.insert(iTemp);

		nCount ++;
	}

	printf("nCount = %d\n",nCount);//total numbers
       
	for(IntSet::iterator iter = iArray.begin(); iter != iArray.end(); ++ iter)
	{
		fprintf(outfile,"%d ",*iter);
	}

}

int main()
{
	FILE *fpInput,*fpOutput;

	if(NULL == (fpInput = fopen("D:\\input.txt","r")))
	{
		printf("File read error!\n");
		exit(1);
	}

	if(NULL == (fpOutput = fopen("D:\\output.txt","w")))
	{
		printf("File write error!\n");
		exit(1);
	}

	Dedup(fpInput,fpOutput);	
	printf("\n");

	fclose(fpInput);
	fclose(fpOutput);

	return 0;
}
②实现方法二(采用STL):

#include <iostream>
#include <algorithm>     
#include <vector>  

using namespace std;

void Dedup(FILE* infile,FILE* outfile)
{
	int iTemp;
	unsigned int nCount = 0;

	vector<int> iArray,iRes;

	while(NULL == feof(infile))
	{
		fscanf(infile,"%d",&iTemp);
		iArray.push_back(iTemp);

		nCount ++;
	}

	printf("nCount = %d\n",nCount);//total numbers

	sort(iArray.begin(), iArray.end());//sort 

	unique_copy(iArray.begin(), iArray.end(),back_inserter(iRes));//去掉重复的
       
	for(vector <int>::const_iterator iter = iRes.begin(); iter != iRes.end(); ++ iter)
	{
		fprintf(outfile,"%d ",*iter);
	}
}
int main()
{
	FILE *fpInput,*fpOutput;

	if(NULL == (fpInput = fopen("D:\\input.txt","r")))
	{
		printf("File read error!\n");
		exit(1);
	}

	if(NULL == (fpOutput = fopen("D:\\output.txt","w")))
	{
		printf("File write error!\n");
		exit(1);
	}

	Dedup(fpInput,fpOutput);
	printf("\n");

	fclose(fpInput);
	fclose(fpOutput);

	return 0;
}
③实现方法三(采用STL):

#include   <iostream> 
#include   <string> 
#include   <vector> 
#include   <set> 
#include   <algorithm> 

using namespace std;

template <typename T> 
void print_element(T value) 
{ 
	cout<<value<<" "; 
} 

template <typename T> 
unsigned int MakeUniqueArray1(T* array, unsigned int length) 
{ 
	set<T> s(array, array + length); 
    //copy(s.begin(), s.end(), array); 

	printf("%d Number1.\n",s.size());
    return s.size(); 
}

template <typename T> 
unsigned int MakeUniqueArray2(T* array, unsigned int length) 
{ 
	vector<T> v(array, array + length); 
    sort(v.begin(), v.end()); 

    T* end = unique_copy(v.begin(), v.end(), array); 

	printf("%d Number2.\n",end - array);

    return end - array; 
} 

int main() 
{ 
	int a[] = {0,1,2,3,4,5,6,7,8,9,0,9,8,7,6,5,4,3,2,1}; 
	
	unsigned int len = sizeof(a) / sizeof(int);

	len = MakeUniqueArray1(a, len);	
	len = MakeUniqueArray2(a, len); 
    
	void (*pfi)(int) = print_element; 
	for_each(a, a + len, print_element<int>); 
       
	printf("\n");
	return 0; 
}

④C++ 普通实现方法

#include <stdio.h>

int* XRemove(int *Src, int Size,int *Dst, int &nSize)
{
    bool* Index = new bool[Size];

    for(int i = 0; i < Size; ++i)
        Index[i] = true;

    int* Crt = Dst;    

	nSize = 0;
    for(int x = 0; x < Size; ++x)
    {
        if(0 == Index[x])
            continue;

        for(int y = x + 1; y < Size; ++y)
            if(Src[x] == Src[y])
                Index[y] = false;

		if(Index[x]){
			nSize ++;
            *Crt++ = Src[x];
		}
    }

    delete [] Index;
    return Dst;
}

void main()
{
	int Src[]={1,3,4,3,2,5,2};

	int Size = sizeof(Src) / sizeof(int);
	int *Dst =  new int [Size];

	int nSize;
	XRemove(Src, Size, Dst, nSize);

	for(int i = 0;i < nSize;i ++)
		printf("%d ",Dst[i]);

	printf("\n");
}
二)去掉重复出现的数字

例如:int a[]={1,3,4,3,2,5,2};

输出:1 4 5

C++ 实现方法:

#include <stdio.h>

int* XRemove(int Dst[], int Src[], int Size,int &nSize)
{
    bool* Index = new bool[Size];

    for(int i = 0; i < Size; ++i)
        Index[i] = true;

    int* Crt = Dst;
    bool Sig;

	nSize = 0;
    for(int x = 0; Sig = (x < Size); ++x)
    {
        if(Index[x] == 0)
            continue;

        for(int y = x + 1; y < Size; ++y)
            if(Src[x] == Src[y])
                Sig = Index[y] = false;

		if(Sig){
			nSize ++;
            *Crt++ = Src[x];
		}
    }

    delete [] Index;
    return Dst;
}

void main()
{
	int Src[]={1,3,4,3,2,5,2};

	int Size = sizeof(Src) / sizeof(int);

	int *Dst =  new int [Size];

	int nSize;

	XRemove(Dst,Src, Size,nSize);

	for(int i = 0;i < nSize;i ++)
		printf("%d ",Dst[i]);

	printf("\n");
}

小结:使用vector容器可以很快解决。看来还是要多掌握一些知识和技术,拓宽自己的研究。有些问题也许用另一种方法,其实很简单,执行效率也很高。那么,我们为何不尝试一下呢?从中想想,要注意的问题?



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值