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
}
};
質問する
86 次
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::set
usesのデフォルト コンパレータ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 に答える