我有一个 vector 叫做:
vector<MiniPair> miniPairVector;
MiniPair对象内部有2个属性,1个是整数docNumber
,另一个是字符串word
我正在尝试清除此 vector 中的重复项,这意味着如果 docNumber 和 word 存在于 vector 中的另一个对象中,则删除重复项
这是我尝试过的方法,但它会产生无限循环:
for (int i = 0; i < miniPairVector.size(); i++) {
for (int k = i + 1; k < miniPairVector.size(); k++) {
if (miniPairVector[i].getDocNumber() == miniPairVector[k].getDocNumber() && miniPairVector[i].getWord() == miniPairVector[k].getWord()) {
cout << "i am erasing" << endl;
miniPairVector.erase(miniPairVector.begin() + k);
}
}
}
这是迷你对类:
#pragma once
// classes example
#ifndef MINIPAIR_H
#define MINIPAIR_H
#include <iostream>
using namespace std;
class MiniPair {
friend bool operator<(MiniPair const &a, MiniPair const &b) {
return a.docNumber < b.docNumber || a.docNumber == b.docNumber && a.word < b.word;
}
friend bool operator==(MiniPair const &a, MiniPair const &b) {
return a.docNumber == b.docNumber && a.word == b.word;
}
private:
string word;
int docNumber;
public:
MiniPair();
MiniPair(string word, int docNumber);
string getWord();
int getDocNumber();
};
#endif
最佳答案
我的假设是您正在为类做这件事。
首先,虽然由于类强加的约束,这可能与您正在解决的问题无关,但这是一种糟糕的实现方式。如果正确实现,比较次数将类似于 miniPairVector.size() * miniPairVector.size()
。 .这是很多比较,比您实际需要的要多得多。
如果我尝试在非玩具(或非作业)程序中执行此操作,我会使用 <algorithm>
标准库的一部分。我会用 ::std::sort
然后 ::std::unique
.
下面是我将如何使用这两个来做到这一点:
#include <algorithm>
void remove_dupes(::std::vector<MiniPair> &minipair_vec)
{
::std::sort(minipair_vec.begin(), minipair_vec.end(),
[](MiniPair const &a, MiniPair const &b) -> bool {
return (a.getDocNumber() < b.getDocNumber())
|| ((a.getDocNumber() == b.getDocNumber())
&& (a.getWord() < b.getWord())));
}); // End lambda and sort.
auto newend = ::std::unique(minipair_vec.begin(), minipair_vec.end(),
[](MiniPair const &a, MiniPair const &b) -> bool {
return a.getDocNumber() == b.getDocNumber()
&& a.getWord() == b.getWord();
}); // End lambda and unique.
minipair_vec.resize(newend - minipair_vec.begin());
}
我已经测试过了,所以它应该可以正常工作。
一般的教训是,如果你发现自己在循环,请完成这组问题:
- 我是否在为线性数据结构编制索引?如果是这样,我为什么要使用索引而不是迭代器?
- 是否有一种算法已经可以满足我的需求,或者可以轻松组合几种算法来满足我的需求?
我提供的代码应该在与 minipair_vec.size() * ::std::log2(minipair_vec.size())
成正比的时间内运行.您编写的代码将在与 minipair_vec.size() * minipair_vec.size()
成正比的时间内运行(一旦你让它工作),这对于一个大列表来说要长得多。
关于c++ - 清除 vector 中的重复对象会产生无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53253642/