矢量排序和擦除不起作用

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&lt; 不要让我们猜测vec的类型。请创建最短的完整程序来演示您的错误并将其发布到您的问题中。 sscce.org @Rob 我已经添加了我的程序的最小部分。 @bobthemac:它很小(很棒)但也不完整。 wordFrequency 是什么 bool operator&lt;(wordFrequency const&amp;, wordFrequency const&amp;) 看起来像什么?我们不能用半个问题给出有意义的答案。哦,exact 错误信息是什么? 请不要为了单一分类而介绍operator&lt;。仅在对类型真正有意义时才引入它。 【参考方案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&lt;是有道理的。

另请注意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 &amp;lhs, wordFrequency const &amp;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&lt; 没有为 vec 包含的对象类型声明。你超载了吗?它应该看起来像这样:

bool operator<(const YourType& _a, const YourType& _b)

   //... comparison check here

【讨论】:

我觉得真正需要的是运营商 @Rob:你们都是对的,我认为 == 因为std::unique 调用,但显然提供了operator==。我会纠正的。【参考方案3】:

该代码应该可以工作,因为 std::unique 返回一个指向重复元素开头的迭代器。您的向量包含什么类型?也许您需要实现相等运算符。

【讨论】:

以上是关于矢量排序和擦除不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ng-repeat 排序箭头在 javascript 数据表中不起作用

Xcode 11 PDF 图像资产“保留矢量数据”在 SwiftUI 中不起作用?

四元数旋转不起作用

插入排序的快速排序代码不起作用

dsp擦除flash需要多久

排序在 jQuery 数据表中不起作用