C ++删除结构向量中的重复元素

时间:2015-12-31 10:34:39

标签: c++ vector duplicates

在我开始解决这个问题之前,我想做一个说明。我知道这已发布,我已经阅读了包含与我的问题几乎相同的帖子。我为此道歉,但我不明白该怎么做。

所以..我有这个结构

struct Url
{
    string host;
    string path;
    string content;
    bool visited;
};

main()函数中,我正在制作vector<Url>。到目前为止,我已经在vector填写了我需要的信息。

我在这里读到的其他问题说,首先我必须sort vector<Url>才能删除重复项。我现在唯一想做的就是从向量中删除Url个等于Url.path的值。

我将不胜感激。提前谢谢!

2 个答案:

答案 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. Less than comparabale

  2. tie

答案 1 :(得分:-1)

首先我们需要一个比较Urls的函数。

bool compare_url (const Url& u, const Url& v) {
    return !(u.path.compare(v.path));
}

现在,为了删除vector中的重复项,我们可以使用模板库algorithm中的函数:sortunique。将函数指针传递给比较函数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;,保证不会出现重复和更快的访问。