带有自定义字符串比较器的字符串priority_queue的C ++向量

时间:2016-04-04 16:06:39

标签: c++ string c++11 vector priority-queue

我有vector priority_queuestring s:

vector<priority_queue<string>>> queues(VECTOR_CAPACITY);

问题是如何将自定义string比较器应用于那些priority_queue

如果这是相关的,我想要的比较器在较长的字符串之前放置较短的字符串,当它们的长度相等时使用标准的字符串比较。

我试过这种方式:

auto comparator = [] (string s1, string s2) { return s1.length() < s2.length() || s1 < s2; };
vector<priority_queue<string, vector<string>, decltype(comparator)>> queues(VECTOR_CAPACITY);

但它无法编译并出现以下错误:

No matching constructor for initialization of 'value_compare' (aka
'(lambda at Example.cpp:202:23)')

编辑: 将较短字符串放在较长字符串之前以及它们长度相等时使用标准字典比较的比较器如下所示:

auto comparator = [] (string s1, string s2)
{
    if (s1.length() != s2.length())
    {
        return s1.length() > s2.length();
    }
    return s1.compare(s2) > 0;
};

1 个答案:

答案 0 :(得分:4)

您还需要将lambda的实例传递给std::priority_queuethis Q&A说:

using my_queue_t = std::priority_queue<
    std::string, std::vector<std::string>, decltype(comparator)>;

std::vector<myqueue_t> queues(VECTOR_SIZE, my_queue_t(comparator));

不幸的是, copy-list-initialization {comparator}在这里不起作用,因为2nd constructor overload由于某种原因被标记为explicit

我将VECTOR_CAPACITY更改为VECTOR_SIZE,因为这就是参数的含义。