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

述語は 2 つのパラメーターを取り、bool を返す必要があります。

関数はメンバー関数であるため、署名が間違っています。

さらに、ファンクタを使用して、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アルゴリズムは、事前に並べ替えられたコレクションでのみ機能することに注意してください。継続的に頼ることなく別のメンバーを検索できるようにしたい場合は、これらのフィールドにインデックスを作成することをお勧めします。multi_index

于 2012-10-19T06:31:14.803 に答える
2

エラーの 1 つは、lower_bound (compareValueコード内) の 4 番目の引数をメンバー関数にできないことです。それはファンクタまたはフリー関数です。あなたの場合、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 Valuequaltiyの代わりに間違った型があります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()はそれを呼び出そうとします。2 つの引数を渡すだけで、余分なオブジェクトはありません。関数をメンバーにしたい場合は、メンバーにすることができます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 に答える