Первая проблема.
unique
использовано неправильно
unique(words.begin(), words.end(), words.end()));
Вы вызываете форму с тремя операндами unique
, которая принимает начало, конец и предикат. Компилятор передаст words.end()
в качестве предиката, и функция ожидает, что он будет вашим функтором сравнения. Очевидно, что это не один, и вы попадаете в счастливый мир сообщений об ошибках C ++.
Вторая проблема.
либо используйте предикатную форму, либо определите порядок
См. Определения sort и уникальных .
Вы можете предоставить
bool operator< (wordFrequency const &lhs, wordFrequency const &rhs)
{
return lhs.val_ < rhs.val_;
}
, но делайте это только в том случае, если операция less-than
имеет смысл для этого типа, т. Е. Если есть естественное упорядочение, и если оно не просто произвольное (возможно, вы захотите другие порядки сортировки в будущем?).
В общем случае для сортировки используйте формы предикатов:
auto pred = [](wordFrequency const &lhs, wordFrequency const &rhs)
{
return lhs.foo < rhs.foo;
};
sort (words.begin(), words.end(), pred);
words.erase (unique (words.begin(), words.end(), pred));
Если вы не можете C ++ 11, напишите функтор:
struct FreqAscending { // should make it adaptible with std::binary_function
bool operator() (wordFrequency const &lhs, wordFrequency const &rhs) const
{ ... };
};
Полагаю, в вашем случае ("частота слов"), operator<
имеет смысл.
Также обратите внимание vector :: erase : Это удалит элемент, указанный переданным итератором. Но , см. Также std :: unique , unique
возвращает итератор для нового конца диапазона, и я не уверен, действительно ли вы хотите удалить новый конец диапазон. Это то, что вы имеете в виду?
words.erase (words.begin(),
unique (words.begin(), words.end(), pred));
Третья проблема.
Если вам нужна только десятка, не надо sort
C ++ поставляется с различными алгоритмами сортировки ( на основе этого ). Для топ-10 вы можете использовать:
Это тратит меньше энергии на ваш ЦП, будет способствовать общей производительности настольного компьютера, а батареи вашего ноутбука будут работать дольше, поэтому могут выполнять еще больше операций.