0
class Tuple
{
private:
    vector<string> values;
public:
    Tuple(vector<Parameter> newValues)
    {
        for(int i = 0; i < newValues.size(); i++)
        {
            string val = newValues[i].getValue();
            values.push_back(val);
        }
    }

    Tuple(vector<string> newAttributes)
    {
        values = newAttributes;
    }

    ~Tuple()
    {

    }

    bool operator < (Tuple &tup)
    {
        if(values < tup.getStringVec())
            return true;

        return false;
    }

    bool operator <= (Tuple &tup)
    {
        if(values <= tup.getStringVec())
            return true;

        return false;
    }

    bool operator > (Tuple &tup)
    {
        if(values > tup.getStringVec())
            return true;

        return false;
    }

    bool operator >= (Tuple &tup)
    {
        if(values >= tup.getStringVec())
            return true;

        return false;
    }
};


class Relation
{
private:

    set<Tuple> tupleSet;
public:
    Relation():
    {

    }

    ~Relation()
    {

    }

    void addToTupleSet(Tuple newTuple)
    {
        tupleSet.insert(newTuple); //<<this causes the problem
    }

};
4

3 に答える 3

1

演算子「<」には以下を使用

bool operator < (const Tuple &tup) const
{
    /*if(values < tup.getStringVec())
        return true;*/             //getStringVec undefined, so comment out temporarily

    return false;
}
于 2013-11-10T05:29:49.533 に答える
1

std::setusesのデフォルト コンパレータstd::less<T>。これには、オブジェクトoperator <を何らかの形式の に公開する必要があります。これは通常、次の 2 つの形式のいずれかになります。

次のような無料の関数:

bool operator <(const Tuple& arg1, const Tuple& arg2);

または次のようなメンバー関数:

class Tuple
{
public:
    bool operator <(const Tuple& arg) const
    {
        // comparison code goes here
    }
};

operator <で使用するためだけに実装したくない場合はstd::set、独自のバイナリ コンパレータ タイプを直接実装し、それを のコンパレータの代替として使用できますstd::less<T>。あなたがするかどうかはあなたの電話であり、別の質問に対する別の解決策です(つまり、ニヤズが別の回答でカバーした方法)。

あなたのコードは、名前空間stdを吸い込まず、必要に応じて参照を使用するようにわずかに変更されています(データをあちこちにコピーするのにかかる時間を大幅に短縮するので、これらを見てみるとよいでしょう)。

#include <iostream>
#include <string>
#include <iterator>
#include <vector>
#include <set>

// I added this, as your source included no such definition 
class Parameter
{
public:
    Parameter(const std::string s) : s(s) {}

    const std::string& getValue() const { return s; }

private:
    std::string s;
};

class Tuple
{
private:
    std::vector<std::string> values;

public:
    Tuple(const std::vector<Parameter>& newValues)
    {
        for(auto val : newValues)
            values.push_back(val.getValue());
    }

    Tuple(const std::vector<std::string>& newAttributes)
        : values(newAttributes)
    {
    }

    // note const member and parameter. neither the passed object nor
    //  this object should be modified during a comparison operation.
    bool operator < (const Tuple &tup) const
    {
        return values < tup.values;
    }
};


class Relation
{
private:
    std::set<Tuple> tupleSet;

public:
    void addToTupleSet(const Tuple& tup)
    {
        tupleSet.insert(tup);
    }
};

int main(int argc, char *argv[])
{
    Tuple tup({"a","b","c"});
    Relation rel;

    rel.addToTupleSet(tup);

    return 0;
}
于 2013-11-10T05:24:12.887 に答える