簡體   English   中英

對struct向量的C ++操作

[英]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.urlstring類型)。 當未明確給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

有兩種解決方案:

  1. 提供適當的比較功能
    • bool operator==(rankingElement const& lhs, std::string const& rhs)
  2. 使用find版本,該版本允許您傳遞函數/函數
    • std::find_if(ranking.begin(), ranking.end(), test_Ranking_against_url)

很重要的一點:

  1. 永遠不要 using namespace std; 在頭文件中。

  2. 您可以using namespace std;來放置它using namespace std; 源文件。
    但是我什至不鼓勵這樣做。
    最好使用std所有成員的長格式。 (即std :: vector(不是vector))。

  3. 通過引用傳遞任何大對象(如矢量)。
    如果您不想更改原始內容,請使用const reference。
    這樣就不會產生復制操作的費用。

當您將UDF類型用作STL容器的類型時,必須提供有效的信息:

  1. 復制ctor;
  2. 復制分配運算符('operator =')
  3. 至少是operator==operator<

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM