сортировка и удаление векторов не будут работать - PullRequest
1 голос
/ 08 марта 2012

При использовании этого кода для удаления дубликатов я получаю недопустимые операнды к ошибкам двоичного выражения. Я думаю, что это сводится к использованию вектора структуры, но я не уверен, что гуглил свой вопрос, и я получаю этот код снова и снова, что говорит о том, что этот код правильный, но он не работает для меня.

std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());

Любая помощь будет оценена.

EDIT:

fileSize = textFile.size();
vector<wordFrequency> words (fileSize);
int index = 0;
for(int i = 0; i <= fileSize - 1; i++)
{
    for(int j = 0; j < fileSize - 1; j++)
    {
        if(string::npos != textFile[i].find(textFile[j]))
        {
            words[i].Word = textFile[i];
            words[i].Times = index++;
        }
    }
    index = 0;
}

sort(words.begin(), words.end());
words.erase(unique(words.begin(), words.end(), words.end()));

Ответы [ 3 ]

5 голосов
/ 08 марта 2012

Первая проблема.

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 вы можете использовать:

  • nth_element: дает верхние элементы без их сортировки
  • partial_sort: дает вам верхние элементы, отсортированные

Это тратит меньше энергии на ваш ЦП, будет способствовать общей производительности настольного компьютера, а батареи вашего ноутбука будут работать дольше, поэтому могут выполнять еще больше операций.

2 голосов
/ 08 марта 2012

Наиболее вероятный ответ: operator< не объявлено для типа объекта, который содержит vec. Вы перегрузили это? Это должно выглядеть примерно так:

bool operator<(const YourType& _a, const YourType& _b)
{
   //... comparison check here
}
0 голосов
/ 08 марта 2012

Этот код должен работать, так как std :: unique возвращает итератор, указывающий на начало дублированных элементов. Какой тип содержит ваш вектор? Возможно, вам нужно реализовать оператор равенства.

...