比较下限中的函数

时间:2012-10-19 06:25:00

标签: c++ stl

我有以下结构

    enum quality { good = 0, bad, uncertain };

    struct Value {
       int time;
       int value;
       quality qual;
    };

    class MyClass {

public:
    MyClass() {
        InsertValues();
    }

       void InsertValues();

       int GetLocationForTime(int time);

private:

    vector<Value> valueContainer;
};

void MyClass::InsertValues() {
    for(int num = 0; num < 5; num++) {
        Value temp;
        temp.time = num;
        temp.value = num+1;
        temp.qual = num % 2;
        valueContainer.push_back(temp);
    }
}


int MyClass::GetLocationForTime(int time)
{

   // How to use lower bound here.
   return 0;
}

在上面的代码中,我遇到了很多编译错误。我想我在这里做错了我是STL编程的新手,请你纠正我的错误在哪里?这样做有好处吗?

谢谢!

5 个答案:

答案 0 :(得分:11)

谓词需要带两个参数并返回bool。

由于你的函数是一个成员函数,它的签名是错误的。

此外,您可能需要使用您的仿函数将Value与int,Value to Value,int to Value和int to int进行比较。

struct CompareValueAndTime
{
   bool operator()( const Value& v, int time ) const 
   {
       return v.time < time;
   }

   bool operator()( const Value& v1, const Value& v2 ) const 
   {
       return v1.time < v2.time;
   }

   bool operator()( int time1, int time2 ) const
   {
       return time1 < time2;
   }

   bool operator()( int time, const Value& v ) const
   {
      return time < v.time;
   }
};

这很麻烦,所以让我们减少它:

struct CompareValueAndTime
{
   int asTime( const Value& v ) const // or static
   {
      return v.time;
   }

   int asTime( int t ) const // or static
   {
      return t;
   }

   template< typename T1, typename T2 >
   bool operator()( T1 const& t1, T2 const& t2 ) const
   {
       return asTime(t1) < asTime(t2);
   }
};

然后:

std::lower_bound(valueContainer.begin(), valueContainer.end(), time,
   CompareValueAndTime() );

还有其他一些错误,例如在类声明的末尾没有分号,加上一个类的成员默认是私有的,这使得你的整个类在这种情况下是私有的。你在构造函数之前错过了public:吗?

您的函数GetLocationForTime不返回值。您需要获取lower_bound的结果并从中减去begin()。该函数也应该是常量。

如果要在此插入此调用的意图,则考虑在向量中插入是O(N)操作的事实,因此向量可能是错误的集合类型。

请注意,lower_bound算法仅适用于预先排序的集合。如果您希望能够在不连续求助的情况下查找不同的成员,则需要在这些字段上创建索引,可能使用boost multi_index

答案 1 :(得分:2)

一个错误是lower_bound的第四个参数(代码中的compareValue)不能是成员函数。它可以是函子或自由函数。使它成为MyClass的朋友的自由功能似乎是最简单的。你也错过了return关键字。

class MyClass {
    MyClass() { InsertValues(); }
    void InsertValues();
    int GetLocationForTime(int time);
    friend bool compareValue(const Value& lhs, const Value& rhs)
    {
        return lhs.time < rhs.time;
    }

答案 2 :(得分:2)

  1. Class关键字必须从较低的c - class开始。
  2. struct Value类型错误qualtiy而不是quality
  3. 我没有看到using namespace std使用没有它的STL类型。
  4. vector<value> - 错误的类型value而不是Value
  5. 我认为你必须首先检查它,然后才会发布这样简单的错误。 而这里的主要问题是比较函数不能成为类的成员。将它用作自由函数:

    bool compareValue(const Value lhs, const int time) { 
        return lhs.time < time ; 
    }
    

答案 3 :(得分:0)

class是关键字而不是“类”:

class MyClass {

其身体后面应加分号; 可能还有其他错误,但您可能需要将它们粘贴到问题中以获得进一步的帮助。

答案 4 :(得分:0)

您只想让compareValue()成为正常功能。你现在实现它的方式,你需要一个MyClass类型的对象。 std::lower_bound()将尝试调用它的方式,它将传递两个参数,没有额外的对象。如果你真的希望它成为一个成员的功能,你可以使它成为static成员。

也就是说,直接使用函数会有性能损失。您可能希望比较器类型具有inline函数调用运算符:

struct MyClassComparator {
    bool operator()(MyClass const& m0, MyClass const& m1) const {
        return m0.time < m1.time;
    }
};

...并使用MyClassComparator()作为比较器。