矢量排序和擦除将无法正常工作

bob*_*mac 1 c++ sorting vector erase

使用此代码删除重复项时,我得到二进制表达式错误的无效操作数.我认为这取决于使用结构的向量,但我不确定我用Google搜索了我的问题,我一遍又一遍地得到这个代码,这表明这段代码是正确的,但它对我不起作用.

std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

编辑:

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()));
Run Code Online (Sandbox Code Playgroud)

Seb*_*ach 5

第一个问题.

unique 错误地使用了

unique(words.begin(), words.end(), words.end()));
Run Code Online (Sandbox Code Playgroud)

您正在调用三个操作数形式unique,它采用开始,结束和谓词.编译器将words.end()作为谓词传递,函数希望它是您的比较函子.显然,它不是一个,你进入了C++错误消息的幸福世界.

第二个问题.

要么使用谓词形式,要么定义排序

查看sortunique的定义.

你可以提供一个

bool operator< (wordFrequency const &lhs, wordFrequency const &rhs)
{
    return lhs.val_ < rhs.val_;
}
Run Code Online (Sandbox Code Playgroud)

,但只有当一个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));
Run Code Online (Sandbox Code Playgroud)

如果你不能用C++ 11,那就写一个仿函数:

struct FreqAscending { // should make it adaptible with std::binary_function
    bool operator() (wordFrequency const &lhs, wordFrequency const &rhs) const
    { ... };
};
Run Code Online (Sandbox Code Playgroud)

我想在你的情况下("词的频率"),operator<是有道理的.

另请注意vector :: erase:这将删除传递的迭代器指示的元素.但是,另请参见std :: unique,unique将迭代器返回到范围的新端,我不确定您是否确实要删除范围的新端.你是这个意思吗?

words.erase (words.begin(),
             unique (words.begin(), words.end(), pred));
Run Code Online (Sandbox Code Playgroud)

第三个问题.

如果你只需要前十名,不要 sort

C++带有不同的排序算法(基于此).对于前10名,您可以使用:

这会浪费你的CPU更少的瓦特,将有助于整体桌面性能,并且你的笔记本电脑电池寿命更长,所以可以做更多种类.