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)
unique 错误地使用了unique(words.begin(), words.end(), words.end()));
Run Code Online (Sandbox Code Playgroud)
您正在调用三个操作数形式unique,它采用开始,结束和谓词.编译器将words.end()作为谓词传递,函数希望它是您的比较函子.显然,它不是一个,你进入了C++错误消息的幸福世界.
你可以提供一个
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)
sortC++带有不同的排序算法(基于此).对于前10名,您可以使用:
nth_element:为您提供顶级元素而不对其进行排序partial_sort:给你顶级元素,排序 这会浪费你的CPU更少的瓦特,将有助于整体桌面性能,并且你的笔记本电脑电池寿命更长,所以可以做更多种类.