5

我有以下结构

    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 编程的新手,你能纠正我错误在哪里吗?有更好的方法吗?

谢谢!

4

5 回答 5

13

谓词需要带两个参数并返回布尔值。

由于您的函数是成员函数,因此它的签名错误。

此外,您可能需要能够使用函子将 Value 与 int、Value 与 Value、int 与 Value 以及 int 与 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:构造函数之前的a吗?

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

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

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

于 2012-10-19T06:31:14.803 回答
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;
    }
于 2012-10-19T06:29:59.083 回答
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 ; 
}
于 2012-10-19T06:31:23.890 回答
0

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

class MyClass {

并且它的正文后面应该是分号;
可能还有其他错误,但您可能必须将它们粘贴到问题中以获得进一步帮助。

于 2012-10-19T06:27:52.157 回答
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()用作比较器。

于 2012-10-19T06:30:18.207 回答