4

このコードに問題があります (cubeBoxData は cubeBox のセットです):

cubeBox temp(bx,by,bz);
cubeBoxData.insert(temp);
set<cubeBox>::iterator i = cubeBoxData.find(temp);
const_cast<cubeBox&>(*i).addCube(x,y,z);

問題は、cubeBoxData.find(temp); です。temp が見つからない場合、プログラムは addCube() の呼び出しに失敗します。理由はわかりません。このコードは正常に動作するためです (3 行目を変更するだけです)。

cubeBox temp(bx,by,bz);
cubeBoxData.insert(temp);
set<cubeBox>::iterator i = find(cubeBoxData.begin(),cubeBoxData.end(),temp);
const_cast<cubeBox&>(*i).addCube(x,y,z);

cubeBox の演算子 < は次のとおりです。

bool operator<(const cubeBox& c) const {
    return x<c.x ? true : y<c.y ? true : z<c.z ? true : false;
}

addCube は x、y、z を変更しません。

私の operator< は間違っていると思います。何かばかげたことを見逃していますが、それが何であるかわかりません。

4

2 に答える 2

5

定義したは厳密な弱い順序付けをoperator<確立しません。たとえば、あなたのコンパレーターによると、それは両方の場合です それと それ。その結果、 でのすべての操作の動作が未定義になります。{1,0,1} < {0,1,0}{0,1,0} < {1,0,1}set

厳密な弱い順序付けが確立されるように、比較操作を書き直す必要があります。これを行う最も簡単な (?) 方法は、次を使用することstd::tupleです。

bool operator<(const cubeBox& c) const {
    return std::tie(x,y,z) < std::tie(c.x,c.y,c.z);
}
于 2013-01-12T00:36:21.083 に答える
0

前の回答を統合するには:

セットの要素は何らかの理由で const です。 const_cast と変更だけではできません。これを行うと、要素を並べ替える必要があることをセットに伝えていないためです。関数はおそらく要素の並べ替え順序を変更するためaddCube、正しい方法は次のとおりです。

cubeBox cpy = *i;
cubeBoxData.erase(i);
cpy.addCube(x,y,z);
cubeBoxData.insert(cpy);
于 2013-01-12T01:07:07.533 に答える