[英]C++ operations on vector of struct
我收到錯誤消息“操作符== 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()函數的行似乎會生成錯誤。 它是來自類算法的函數,用於檢查向量是否已包含某些元素。 我發現這是錯誤的,因為我嘗試在find函數中將struct與string進行比較。 我可以通過將網址從排名復制到另一個字符串向量,然后在find函數中使用該字符串向量來解決此問題,但是當我嘗試這樣做時,我無法訪問“排名”向量中的元素-例如rank [i] .url不起作用,我也不知道為什么..並且幫助將不勝感激。
find(ranking.begin(), ranking.end(), rElement.url)
您要告訴find在[ranking.begin(), ranking.end())
(具有類型元素rankingElements
)中搜索rElement.url
( string
類型)。 當未明確給std::find
提供比較功能時,它將嘗試使用operator==
將元素與搜索到的元素進行比較。 因此,它嘗試調用顯然不存在的operator==(rankingElement, string)
。 Imo進行類似工作的最佳方法是使用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
工作
編譯器無法知道如何將rankingElement
類型的對象與string
類型的對象進行比較(這就是std :: find中發生的事情)。
在std :: find中,您正在執行測試:
find(ranking.begin(), ranking.end(), rElement.url)
// Inside this you are iterating through a vector of `rankingElement`
// But the element you ae testing against is: `rElement.url` which is a std::string
// Sort of like this:
ranking[0] == rElement.url
^^^^^^^^^^^^ Object of type string
^^^^^^^^^^ Object of type rankingElement
有兩種解決方案:
bool operator==(rankingElement const& lhs, std::string const& rhs)
std::find_if(ranking.begin(), ranking.end(), test_Ranking_against_url)
永遠不要 using namespace std;
在頭文件中。
您可以using namespace std;
來放置它using namespace std;
源文件。
但是我什至不鼓勵這樣做。
最好使用std所有成員的長格式。 (即std :: vector(不是vector))。
通過引用傳遞任何大對象(如矢量)。
如果您不想更改原始內容,請使用const reference。
這樣就不會產生復制操作的費用。
當您將UDF類型用作STL容器的類型時,必須提供有效的信息:
operator==
和operator<
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.