は、現在の文字列が原因設計上の制約に文字や数字を(含むことができますオーバーロード比較です演算子「無効な演算子は、<」
C++で、文字列を含む各オブジェクトに、オブジェクトのベクトルを並べ替えしようとしますこれはコンパレータを変更できるので必要です)。
現在のところ、オブジェクトのクラスがオーバーロードされているため、2つのオブジェクトが比較されるときに、それらのオブジェクトに含まれる文字列が比較されます。これはちょっとしたことですが、ソート操作(STLソートなど)を使ってオブジェクトを並べると、 "1"、 "4"、 "12"の3つの文字列が順番にソートされます"1"、 "12"、 "4"。 4は12より大きくなりますが、最も左の桁からの比較が始まるため、この「不正な」ソートが発生します。
私の最初の対応は、比較操作のオーバーロード方法を変更することでした。私は最初に私が比較していた文字列の長さをチェックします。文字列の内容が大きかったり小さかったりすると、それは兆候となります。
// overloaded comparision operators
friend bool operator<(const nodeRecord & record1, const nodeRecord & record2){
// we need to deal with strings of different lengths...
if(record1.comparator.length() < record2.comparator.length())
return true;
else
return (record1.comparator < record2.comparator);
}
この操作の結果、実行時に「式:無効な演算子<」というメッセージが表示されます。
私は間違いをどこにしているのですか?ソート操作をどのようにしたいのかを正確に指示することができるように思えます。無効な場合でも、現在はオブジェクトを格納するベクトルを使用しています。 nodeRecordオブジェクトの初期化中に
コンパレータ:あなたは1個のコンパレータを使用し、その機能が少し賢くていないのはなぜ
nodeRecord(int fromNode, int toNode, int connectionCost, bool compareByCost = false){
// take the provided stock information and insert it into the object
stringstream fromNodeSS;
fromNodeSS << fromNode;
this->fromNode = fromNodeSS.str();
stringstream toNodeSS;
toNodeSS << toNode;
this->toNode = toNodeSS.str();
this->connectionCost = connectionCost;
// set the comparator to our chosen comparision term
if (!compareByCost){
this->comparator = this->fromNode; // we use from node in this case, since we build the tree outwards
}
else{
stringstream ss;
ss << this->connectionCost;
this->comparator = ss.str(); // we use the connection cost in this case, to allow us to sort new connections
}
// set this as a non-null (active) record
this->nullRecord = false;
}
コンパレータは何ですか?そのコードを投稿してください。 –
コンパレータの定義を表示していただけますか? –
@Mikeと@Mario - コンパレータは、nodeRecordオブジェクトの初期化中に初期化されます。これは上で見ることができます。 – BSchlinker