使用此代码删除重复项时,我得到二进制表达式错误的无效操作数。我认为这取决于使用结构的向量,但我不确定我用Google搜索了我的问题,我一遍又一遍得到这个代码,这表明这段代码是正确的,但它对我不起作用。
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
任何帮助将不胜感激。
修改
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()));
答案 0 :(得分:5)
unique
unique(words.begin(), words.end(), words.end()));
您正在调用unique
的三个操作数形式,它带有一个开头,一个结尾和一个谓词。编译器将传递words.end()
作为谓词,函数希望它是您的比较函子。显然,它不是一个,你进入了C ++错误消息的幸福世界。
您可以提供
bool operator< (wordFrequency const &lhs, wordFrequency const &rhs)
{
return lhs.val_ < rhs.val_;
}
,但只有在less-than
操作对该类型有意义时才会这样做,即如果有自然排序,并且它不仅仅是任意的(可能你以后想要其他排序顺序?)。 / p>
在一般情况下,使用谓词表单进行排序:
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 ++带有不同的排序算法(based on this)。对于前10名,您可以使用:
nth_element
:为您提供顶级元素而不对其进行排序partial_sort
:为您提供排名这会减少CPU耗电量,降低整体桌面性能,让您的笔记本电脑电池使用寿命更长,可以做更多种类。
答案 1 :(得分:2)
最可能的答案是没有为vec包含的对象类型声明operator<
。你有超载吗?看起来应该是这样的:
bool operator<(const YourType& _a, const YourType& _b)
{
//... comparison check here
}
答案 2 :(得分:0)
该代码应该可以工作,因为std :: unique返回指向重复元素开头的迭代器。你的载体包含什么类型?也许你需要实现相等运算符。