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

时间:2012-03-08 16:22:34

标签: c++ sorting vector erase

使用此代码删除重复项时,我得到二进制表达式错误的无效操作数。我认为这取决于使用结构的向量,但我不确定我用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()));

3 个答案:

答案 0 :(得分:5)

第一个问题。

错误地使用了

unique

unique(words.begin(), words.end(), words.end()));

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

第二个问题。

使用谓词形式或定义排序

请参阅sortunique的定义。

您可以提供

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::uniqueunique会返回范围新端的迭代器,我不确定您是否确实要删除范围的新结尾。这是你的意思吗?

words.erase (words.begin(),
             unique (words.begin(), words.end(), pred));

第三个问题。

如果您只需要前十名,请不要sort

C ++带有不同的排序算法(based on this)。对于前10名,您可以使用:

这会减少CPU耗电量,降低整体桌面性能,让您的笔记本电脑电池使用寿命更长,可以做更多种类。

答案 1 :(得分:2)

最可能的答案是没有为vec包含的对象类型声明operator<。你有超载吗?看起来应该是这样的:

bool operator<(const YourType& _a, const YourType& _b)
{
   //... comparison check here
}

答案 2 :(得分:0)

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