如果标题不是很具描述性,我很抱歉,我很难弄清楚如何命名这个问题。这是我第一次需要使用一套,尽管我一直在使用地图。
我认为不可能,但我需要问。当我将它添加到我的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显着提高性能(和简单性),因为我的容器需要是唯一的?感谢您的任何帮助或指导,非常感谢。
答案 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)
元素是不可变的,因此您无法修改它们。
如果将set
与指针(或类似)一起使用,则可以修改指向的对象(但不要修改顺序)。 set
返回带有std::set::insert
的{{1}}和一个布尔值来判断元素是否已插入,因此您可以执行以下操作:
pair