是否可以在std :: set比较器中处理相等性?

时间:2014-11-22 11:03:54

标签: c++ c++11 set comparator predicate

如果标题不是很具描述性,我很抱歉,我很难弄清楚如何命名这个问题。这是我第一次需要使用一套,尽管我一直在使用地图。

我认为不可能,但我需要问。当我将它添加到我的std :: set时,我想对结构执行特定操作,但仅当相等为真时才这样。

例如,我可以使用列表,然后使用sort()和unique()列表。在我的谓语中,我可以按照自己的意愿去做,因为如果2个值相等,我将得到结果。

以下是我的列表谓词的快速示例:

bool markovWeightOrdering (unique_ptr<Word>& w1, unique_ptr<Word>& w2) {
        if (w1->word_ == w2->word_) {
                w1->weight_++;
                return true;
        }
        return false;
}

有没有人知道如何获得类似的结果,同时使用std :: set显着提高性能(和简单性),因为我的容器需要是唯一的?感谢您的任何帮助或指导,非常感谢。

2 个答案:

答案 0 :(得分:0)

操纵比较运算符可能不是一个好主意。 您可以将std :: set与谓词一起使用,而不是:

struct LessWord
{
    bool operator () (const std::unique_ptr<Word>& w1, const std::unique_ptr<Word>& w2) {
        return w1->key < w2->key;
    }
};
typedef std::set<std::unique_ptr<Word>, LessWord> word_set;

如果单词存在并且增加权重,则在插入时测试:

word_set words;
std::unique_ptr<Word> word_ptr;
auto insert = words.insert(word_ptr);
if( ! insert.second)
    ++(insert.first->get()->weight_);

注意:从逻辑上讲,这样做会破坏const的正确性。 set元素是不可变的,但unique_ptr允许修改(甚至是对键值的致命修改)。

答案 1 :(得分:0)

<{1}}中的

元素是不可变的,因此您无法修改它们。

如果将set与指针(或类似)一起使用,则可以修改指向的对象(但不要修改顺序)。 set返回带有std::set::insert的{​​{1}}和一个布尔值来判断元素是否已插入,因此您可以执行以下操作:

pair

Live example