我收到错误消息“不匹配运算符==in__first。 这是代码:
头文件:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
struct rankingElement {
string url;
int rank;
};
class RankingCreator {
public:
static const int MAX_QUERY_SIZE = 20;
RankingCreator();
virtual ~RankingCreator();
bool checkPageRank(rankingElement rElement, vector<rankingElement> ranking);
void insertIntoRanking(rankingElement rElement);
};
和源文件:
#include "RankingCreator.h"
bool RankingCreator::checkPageRank(rankingElement rElement,
vector<rankingElement> ranking)
{
if (ranking.size() < MAX_QUERY_SIZE) {
// enough space for another page in ranking
return true;
} else {
if (find(ranking.begin(), ranking.end(), rElement.url) != ranking.end()) {
// url is already in ranking
return false;
} else {
}
}
return true;
}
我尝试在源文件中注释一些代码块,带有 find() 函数的行似乎产生了错误。它是用于检查 vector 是否已包含特定元素的类算法的函数。我发现这是错误的,因为我尝试在 find 函数中比较 struct 和 string。我可以通过将 url 从 ranking 复制到另一个字符串 vector ,然后在 find 函数中使用该字符串 vector 来处理这个问题,但是当我尝试这样做时,我无法访问“ranking” vector 中的元素——例如 ranking[i] .url 不工作,我不知道为什么..和帮助将不胜感激。
最佳答案
find(ranking.begin(), ranking.end(), rElement.url)
你告诉 find 在 [ranking.begin(), ranking.end() 中搜索
(具有 rElement.url
(类型为 string
) )rankingElements
类型的元素)。当没有明确地给 std::find
一个比较函数时,它会尝试使用 operator==
将元素与搜索到的元素进行比较。因此它尝试调用显然不存在的 operator==(rankingElement, string)
。在我看来,实现类似功能的最佳方法是使用接受谓词的 find_if
:
struct functor {
string url;
functor(const string& str):url(str){}
bool operator()(const rankingElement& val) { return val.url == this->url; }
};
...
if(find_if(ranking.begin(), ranking.end(), functor(rElement.url)) != ranking.end() )
否则你可以写一个operator==
:
bool operator==(const rankingElement& elem, const string& url)
{ return elem.url == url; }
这将与 find
一起使用
关于C++ 对结构 vector 的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8638341/