矢量排序和擦除不起作用
Posted
技术标签:
【中文标题】矢量排序和擦除不起作用【英文标题】:vector sort and erase won't work 【发布时间】:2012-03-08 16:22:33 【问题描述】:当使用此代码删除重复项时,我得到二进制表达式错误的无效操作数。我认为这归结为使用结构的向量,但我不确定我是否已经用谷歌搜索了我的问题,并且我一遍又一遍地得到这段代码,这表明这段代码是正确的,但它对我不起作用。
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()));
【问题讨论】:
您是否为向量中的项目定义了operator<
?
请不要让我们猜测vec
的类型。请创建最短的完整程序来演示您的错误并将其发布到您的问题中。 sscce.org
@Rob 我已经添加了我的程序的最小部分。
@bobthemac:它很小(很棒)但也不完整。 wordFrequency
是什么 bool operator<(wordFrequency const&, wordFrequency const&)
看起来像什么?我们不能用半个问题给出有意义的答案。哦,exact 错误信息是什么?
请不要为了单一分类而介绍operator<
。仅在对类型真正有意义时才引入它。
【参考方案1】:
第一个问题。
unique
用错了
unique(words.begin(), words.end(), words.end()));
您正在调用unique
的三个操作数形式,它需要一个开始、一个结束和一个谓词。编译器会将words.end()
作为谓词传递,并且该函数期望它成为您的比较函子。显然,它不是一个,你进入了 C++ 错误消息的快乐世界。
第二个问题。
使用谓词形式或定义排序
查看sort 和unique 的定义。
您可以提供一个
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++ 带有不同的排序算法 (based on this)。对于前 10 名,您可以使用:
nth_element
: 为您提供最重要的元素,无需对其进行排序
partial_sort
: 给你最上面的元素,排序
这会在 CPU 上浪费更少的功率,有助于提高整体桌面性能,并且笔记本电脑的电池续航时间更长,因此可以做更多的事情。
【讨论】:
是的,这就是我的意思,因为我只需要每个单词中的一个来显示前十名。 代码的auto pred = [](wordFrequency const &lhs, wordFrequency const &rhs)
行会引发两个错误,一个是C++ 需要所有规范的类型说明符,第二个是Expected expression
@bobthemac:另见“这个问题”,它大约是前十名:)
@bobthemac:注意使用auto
的代码是C++11代码。你也可以写一个仿函数。
我已经尝试使用partial_sort(words.begin(), words.begin()+10, words.end());
,如本网站链接所示,但我收到三个invalid operands to binary expression
错误。【参考方案2】:
最可能的答案是operator<
没有为 vec 包含的对象类型声明。你超载了吗?它应该看起来像这样:
bool operator<(const YourType& _a, const YourType& _b)
//... comparison check here
【讨论】:
我觉得真正需要的是运营商 @Rob:你们都是对的,我认为 == 因为std::unique
调用,但显然提供了operator==
。我会纠正的。【参考方案3】:
该代码应该可以工作,因为 std::unique 返回一个指向重复元素开头的迭代器。您的向量包含什么类型?也许您需要实现相等运算符。
【讨论】:
以上是关于矢量排序和擦除不起作用的主要内容,如果未能解决你的问题,请参考以下文章
ng-repeat 排序箭头在 javascript 数据表中不起作用