2016-01-21 32 views
0

我编写了下面的代码,用于将唯一值插入数据结构中,从中我可以按排序顺序检索值(在下面的代码中,我使用了优先级队列来实现此目的,但是,任何其他数据结构如分类矢量也可以使用)。但是,我发现下面的代码非常慢,因为我将100万个值插入到我的优先级队列中。是否有人可以帮助我明白,我怎么能提高如下代码:将值唯一地插入优先级队列C++

class unique_queue1 { 
//private: 
public:  
    std::priority_queue<std::pair<vector<int>, double>, vector<std::pair<vector<int>, double> >, CompareClass1 > m_queue; 
    std::set<vector<int> > m_set; 
//public: 
    bool push(const pair<vector<int>, double> & t) { 
     if (m_set.insert(t.first).second) { 
      m_queue.push(t); 
      return true; 
     } 
     return false; 
    } 

    void pop() { 
     assert(!m_queue.empty()); 
     const std::pair<vector<int>, double>& val = front(); 

     std::set<vector<int> >::iterator it = m_set.find(val.first); 
     assert(it != m_set.end()); 

     m_set.erase(it); 
     m_queue.pop(); 
    } 

    const pair<vector<int>, double>& front() const { 
     return m_queue.top(); 
    }  

    bool empty() const{ 
     return m_queue.empty(); 
    } 
}; 
+0

如果您需要'set'那么你并不需要的优先级队列。 'set'总是有第一个项目可以轻松访问。你不需要额外的'find'工作来匹配'set'中的第一项,你根本不需要优先级队列。 – JSF

+0

@JSF我对C++有点新鲜。如果可能的话,我会非常感激,如果你能帮我一点代码。作为C++的新手,我无法理解你在说什么。在我的代码中,我保持“设置”,以便插入优先级队列的值(矢量)是唯一的 –

+0

您需要多快?更改'set'来完成整个工作并消除优先级队列应该使代码快两倍。但是如果你需要更多的改进,你需要更加基本的重新设计。为了使'set'完成整个工作,它必须保存相同的对象,并且具有现在用于优先级队列的相同比较功能(而不仅仅是大部分对象和默认比较)。 – JSF

回答

2

既然要强制唯一性,你真的只需要设定。现在

#include <vector> 
#include <set> 

using namespace std; 
class unique_queue1 
{ 
public: 
    using value_type = std::pair<vector<int>, double>; 
    std::set<value_type, CompareClass1> m_set; 

    bool push(const value_type& t) { 
     return m_set.insert(t).second; 
    } 

    void pop() { 
     m_set.erase(m_set.begin()); 
    } 

    const value_type& front() const { 
     return *m_set.begin(); 
    } 

    bool empty() const{ 
     return m_set.empty(); 
    } 
}; 

,除非你做的那类你一些额外的魔法,你当然可以只需更换整个事情只用一套...

除此之外,您的介绍文字读起来就像您实际上首先需要用数据填充容器,并且只有在完全填充数据后,才需要按排序顺序获取唯一条目。

我建议你尝试一切推到一个载体,然后使用算法std::sortstd::uniquestd::reverse,然后使用pop_back检索数据。我相当肯定,这会比使用set快得多。

这里是如何做到这一点的样子(未经测试):

class unique_queue1 
{ 
public: 
    using value_type = std::pair<vector<int>, double>; 
    std::vector<value_type> values; 

    void push_back(const value_type& t) 
    { 
    return values.push_back(t); 
    } 

    // Must be called between push_back and (pop or front) 
    void prepare() 
    { 
    sort(values.begin(), 
     values.end(), 
     CompareClass1()); // Maybe use lambdas for comparison 
    erase(unique(values.begin(), 
       values.end(), 
       CompareClass2()), // Need a comparator for equality, again, 
            // you might want to use a lambda 
      values.end()); 

    reverse(values.begin(), values.end()); 
    } 

    void pop() 
    { 
    values.pop_back(); 
    } 

    const value_type& front() const 
    { 
    return values.back(); 
    } 

    bool empty() const 
    { 
    return values.empty(); 
    } 
}; 
+0

,但对于设置的解决方案,它给了我一个错误:错误:没有匹配函数调用'std :: set ,double>>,CompareClass1> :: insert(const std :: vector &)' return m_set.insert(t.first).second; ^ –

+0

我没有运行编译器,只是显示了一般的想法。我更新了要编译的代码(尽管我不知道你的比较在做什么,所以你可能仍然遇到一些麻烦)。 – Rumburak

+0

恐怕它仍然给我同样的错误...似乎插入不工作。我正在使用gcc-4.9编译器和C++ 11 –