双重循环问题:结构体vector删除重复元素
现在有结构体向量:
struct link
{
CString a;
CString b;
}link1,link2;
vector < link > v1,v2;
int i,j;
v1中已经存放了一些数据,但这些link有重复的,既a,b分别相等。 比如说:link1:123--45, link2:123--45就是相等的两个link.我想把v1中的重复link删去,只保留一个,写进v2中。 下面是我的程序:
v2.push_back(v1.at(0));//把v1第一个元素放入v2
int counter=0; // 设定计数器 统计v2中的比较次数
for (i=1; i <v1.size(); ++i) //循环比较v1的全部元素
{
for (j=0; j <v2.size(); ++j) //每一个v1中元素和v2中已经放进去的元素比较
{
if ( ( ((v1.at(i)).a).Compare(((v2.at(j)).a))==0 ) &&
( ((v1.at(i)).b).Compare(((v2.at(j)).b))==0 ) )
//如果相等 跳出循环 进行v1中下一个元素的比较
goto n;
else
{
++counter;
if ( counter == (v2.size()) ) //如果和v2中所有元素都不相等
goto m;
}
}
m: v2.push_back( (v1.at(i)) ); //就添加到v2尾部
n: ;
}
然后输出v2,结果竟然和v1的内容一样,全部写入v2了。根本就没有执行比较阿
各位能帮我看看是不是我的算法哪里有问题,万分感谢!
[解决办法]
把string改为CString,增加相应的头文件及测试代码即可。
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct link
{
string a,b;
bool operator <(const link& rhs) const
{
if(a!=rhs.a) return a <rhs.a;
return b <rhs.b;
}
bool operator==(const link& rhs) const
{
return a==rhs.a && b==rhs.b;
}
};
int main()
{
vector <link> LinkV;
sort(LinkV.begin(),LinkV.end());
LinkV.erase(unique(LinkV.begin(),LinkV.end()),LinkV.end());
}