C++ 如何从向量中删除重复项?
我正在写一个程序,它读取一个如下形式的文本文件,将数据导入一个向量,然后用它进行一些计算。目前,我能够成对导入数据,将它们插入向量并对向量进行排序。。然而,我所有的努力都失败了,当涉及到实际删除重复项时,我可以将向量用于其他目的C++ 如何从向量中删除重复项?,c++,C++,我正在写一个程序,它读取一个如下形式的文本文件,将数据导入一个向量,然后用它进行一些计算。目前,我能够成对导入数据,将它们插入向量并对向量进行排序。。然而,我所有的努力都失败了,当涉及到实际删除重复项时,我可以将向量用于其他目的 1 4 5 6 4 5 4 5 5 4 6 7 ... 这是我目前的相关代码。如果我对上面的向量(仅6行)执行vec1.size(),则输出应为5。然而,我尝试的每个文本文件的输出都是1,我不明白为什么 while( g
1 4
5 6
4 5
4 5
5 4
6 7
...
这是我目前的相关代码。如果我对上面的向量(仅6行)执行vec1.size(),则输出应为5。然而,我尝试的每个文本文件的输出都是1,我不明白为什么
while( getline( fs1, instrng ) ) {
istringstream s1(instrng);
int a, b;
s1 >> a >> b;
pair<int,int> pair1 = make_pair(a,b);
vec1.push_back( pair1 );
sort( vec1.begin(), myvec1.end() );
auto last = std::unique(vec1.begin(), vec1.end());
vec1.erase(last, vec1.end());
while(getline(fs1,instrng)){
istringstream s1(仪表);
INTA,b;
s1>>a>>b;
配对1=配对(a,b);
vec1.推回(对1);
排序(vec1.begin(),myvec1.end());
auto last=std::unique(vec1.begin(),vec1.end());
vec1.erase(last,vec1.end());
似乎您希望使用集合
而不是向量
std::map过滤器;
std::map<int, pair<int, int>> filter;
while( getline( fs1, instrng ) ) {
istringstream s1(instrng);
int a, b;
s1 >> a >> b;
pair<int,int> pair1 = make_pair(a,b);
int larger = (a>b?a:b);
int smaller = (a>b?b:a);
int key = larger*10000 + b;
filter[key] = pair1;
}
while(getline(fs1,instrng)){
istringstream s1(仪表);
INTA,b;
s1>>a>>b;
配对1=配对(a,b);
int较大=(a>b?a:b);
小整数=(a>b?b:a);
int键=更大*10000+b;
过滤器[键]=对1;
}
在这个映射上迭代应该可以让您提取
你想要的向量。如果你设想更多的条目,你可能想把任意分配的10000改成一个更大的数字。应该有更可靠的方法来做到这一点。使用。@juanchopanza你应该把它作为一个answer@Zaffy我没有,因为已经有太多重复的了。@juanchopanza我不同意这个q的标记OP明确表示:“程序还需要将“15”和“51”这样的数字计算为一。”这在你链接到的帖子中没有讨论。谢谢@balajeerc,我同意。这里的要求略有不同。这不仅仅是删除基本的重复项。我必须为这个程序使用一个向量,否则我会使用一个集合,而且,我需要处理像(15)和(51)这样的数据对,并将它们作为一个来计算。@kal1nga(1 5)等于(5 1),你应该定义一个新的数据类型(例如一对)来保持它的两个值。如果你解释为什么你不能使用一个集合而不是一个向量,那么这将是有用的。无论如何,从集合中构造向量并不困难。在您的示例中,您应该获得4行,而不是您所说的5行…@kal“我必须使用向量”这是为什么?我在这里重新表述了这个问题,而且我不能使用map函数来实现我的目的。我必须操作最后三行,使其立即工作std::map不是一个函数