在我开始解决这个问题之前,我想做一个说明。我知道这已发布,我已经阅读了包含与我的问题几乎相同的帖子。我为此道歉,但我不明白该怎么做。
所以..我有这个结构
struct Url
{
string host;
string path;
string content;
bool visited;
};
在main()
函数中,我正在制作vector<Url>
。到目前为止,我已经在vector
填写了我需要的信息。
我在这里读到的其他问题说,首先我必须sort
vector<Url>
才能删除重复项。我现在唯一想做的就是从向量中删除Url
个等于Url.path
的值。
我将不胜感激。提前谢谢!
答案 0 :(得分:0)
我假设您想知道如何对结构进行排序。 您可以给一个可以订购Urls的少于运营商或仿函数。 运营商的一个例子是:
bool operator<(const Url &l, consr Url &r){
return tie(l.path, l.host, l.content. l.visited)<tie(r.path, r.host, r.content, r.visited);
}
然后,您可以通过调用std::sort
来对矢量进行排序。
参考:
答案 1 :(得分:-1)
首先我们需要一个比较Urls的函数。
bool compare_url (const Url& u, const Url& v) {
return !(u.path.compare(v.path));
}
现在,为了删除vector
中的重复项,我们可以使用模板库algorithm
中的函数:sort
和unique
。将函数指针传递给比较函数compare_url
作为sort
的参数。在生成的排序向量中,我们可以使用unique
来&#34;删除&#34;连续重复。注意unique
并没有真正删除重复元素(因此向量的大小保持不变),而是通过用不重复的下一个元素替换重复元素来完成删除,并发出新大小的信号。通过将迭代器返回到应该被视为新的 past-the-end 元素[Reference]的元素来缩短范围。因此,我们致电vector::erase
删除重复项。
void remove_dup_vectors (vector <Url>& vu) {
sort(vu.begin(), vu.end(), &compare_url);
vector<Url>::iterator newEnd = unique(vu.begin(),vu.end(), &compare_url);
vu.erase(newEnd, vu.end());
}
此函数的复杂性为O(n lg n)(sort
)+ O(n)(unique
)。
此处的第二个更快的解决方案是使用存储唯一对象的unordered_set
容器。常见的操作插入,搜索和删除在平均情况下具有恒定时间复杂度。这是因为每个键都经过哈希处理。另请注意,元素的排序方式与set
不同。
与前一种情况类似,将定义比较函数,但此处的操作为equal to
,因为每个键都经过哈希处理。
bool operator==(const Url& A, const Url& B) {
return A.path == B.path;
}
此外,将定义散列函数。用于常见操作的散列函数已在functional
标头中定义。我们在这里使用它。
namespace std
{
template<> struct hash<Url> {
size_t operator()(const Url &u) const{
return hash<string>()(u.path);
}
};
}
有了这些,就可以定义和使用变量unordered_set<Url> us;
,保证不会出现重复和更快的访问。