前几天,在做一个项目时从oracle海量数据中选择符合条件的数据,用到select distinct 改成c++语言;代码简化如下:
void select_distinct(vector<string> &ints)//实现select distinct的函数
{
sort(ints.begin(),ints.end());
vector<string>::iterator end_unique=unique(ints.begin(),ints.end());
ints.erase(end_unique,ints.end());
}
之前自己的思路是,将里面重复的选择放在一块,没有重复放在一起然后将他们在组合起来,代码如下:
void find_diff(vector<string> &ints,vector<string> &final_ints)
{
vector<string> ints_1;//存储相同的数
vector<string> ints_2;//存储不同的数
for(vector<string>::size_type i=0;i!=ints.size()-1;++i)//找到其中重复的数并单一的存储在ints_1(2,5)中
{
for (vector<string>::size_type j=i+1;j!=ints.size();++j)
{
if (ints[i]==ints[j])
{
if (ints_1.size()==0)
{
ints_1.push_back(ints[j]);
}
else
{
for (int tmp=0;tmp!=ints_1.size();++tmp)
{
if (ints[j]==ints_1[tmp])
break;
else if (ints[j]!=ints_1[tmp]&&tmp==ints_1.size()-1)//与存储的遍历一遍后都不相同,在最后时添加
ints_1.push_back(ints[j]);
}
}
}
}
}
for(vector<string>::size_type i=0;i!=ints.size();++i)
{
for (vector<string>::size_type j=0;j!=ints_1.size();++j)
{
if (ints[i]==ints_1[j])
break;
if (ints[i]!=ints_1[j]&&j==ints_1.size()-1)
{
ints_2.push_back(ints[i]);
}
}
}
for(int i=0;i!=ints_1.size()+ints_2.size();++i)//输出不重复的
{
if (i<ints_1.size())
{
final_ints.push_back(ints_1[i]);
}
else
final_ints.push_back(ints_2[i-ints_1.size()]);
}
}
在一些数据中是可以的,但是当容器中只有一个值时明显不符合情况:
for(vector<string>::size_type i=0;i!=ints.size();++i)
{
for (vector<string>::size_type j=0;j!=ints_1.size();++j)
可以加上判断条件:
for(vector<string>::size_type i=0;i!=ints.size();++i)
{
if(ints_1.size()!=0)
{
for (vector<string>::size_type j=0;j!=ints_1.size();++j)
{
if (ints[i]==ints_1[j])
break;
if (ints[i]!=ints_1[j]&&j==ints_1.size()-1)
{
ints_2.push_back(ints[i]);
}
}
}
else
{
ints_2.push_back(ints[i]);
}
}
然后对于空容器来说类似的
if (ints.size()==0)
{
}
else
这个只是自己的一个比较繁琐的思路。
总结下:
多看书,自己慢慢进步;
算法中提到的sort函数,unique函数等都是见到后想到的,希望自己多留心多学习。网站学习http://blog.csdn.net/byrsongQQ/article/details/5855090