关于struct的向量的C ++操作

时间:2011-12-26 18:51:51

标签: c++ vector find

我收到错误“无法匹配运营商== 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进行比较。我可以通过将排名中的网址复制到另一个字符串向量然后在查找函数中使用该字符串向量来处理这个问题,但是当我尝试这样做时,我无法访问“排名”向量中的元素 - 例如排名[i] .url不起作用,我不知道为什么......并且会有所帮助。

3 个答案:

答案 0 :(得分:4)

find(ranking.begin(), ranking.end(), rElement.url)

您告诉我要在rElement.url(其类型为string的元素)中搜索[ranking.begin(), ranking.end())(类型为rankingElements)。如果没有明确地给出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

答案 1 :(得分:3)

编译器无法知道如何将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)
  3. 重点:

    1. 从不using namespace std;放入标题文件中。

    2. 您可以将using namespace std;放在源文件中 但我甚至不鼓励这样做 更喜欢使用std的所有成员的长形式。 (即std :: vector(不是vector))。

    3. 通过引用传递任何大型对象(如矢量) 如果您不想更改原稿,请使用const参考 然后,您不会产生复制操作的费用。

答案 2 :(得分:0)

当您使用UDF类型作为STL容器的类型时,您必须提供有效的:

  1. copy ctor;
  2. 复制赋值运算符('operator =')
  3. 且至少operator==operator<