オブジェクトのベクトルでstd :: qsortを使用するのに問題があります。(このコードはループ内にあることに注意してください)
std::vector<s_GridData> info = GetAllAdjacentObjInfoFromMap(FLOOR_OBJ, e_Object::eObject_WIRE, itr.getPos());
//No wires adjacent!
if (info.size() == 0) {
continue;
}
std::cout << "Before sorting: ";
std::cout << info;
std::qsort(&info, info.size(), sizeof(s_GridData),
[](const void *lhs, const void *rhs)->int {
s_GridData gridLhs = *reinterpret_cast<const s_GridData*>(lhs);
s_GridData gridRhs = *reinterpret_cast<const s_GridData*>(rhs);
if (gridLhs.groupID < gridRhs.groupID) return -1;
if (gridRhs.groupID < gridLhs.groupID) return 1;
return 0;
}
);
std::cout << "After sorting: ";
std::cout << info;
ここで特にクイックソートコードでは、クイックソートが私のを消去しているようinfo
です。ラムダに何か問題がありますか?または、代入演算子のオーバーロードのようにqsortを使用するための別の要件がありますか。ただし、これs_GridData
は単に整数値の構造体です。
前もって感謝します。
間違った引数をに渡していますqsort()
(これは実際には元々含まれていないC関数ですnamespace std
):
std::qsort(&info, ...
それinfo
は間違ってstd::vector
いqsort()
ますが、Cスタイルの配列が必要です。あなたはそれをこのように修正することができます:
std::qsort(info.data(), ...
またはC ++ 11より前:
std::qsort(&info[0], ...
ただし、より良い解決策は、を使用することですstd::sort()
。これは、型の安全性やその他の利点を提供する真正なC ++関数です。これは次のようになります。
sort(info.begin(), info.end(),
[](const s_GridData& lhs, const s_GridData& rhs)->bool {
return gridLhs.groupID < gridRhs.groupID;
});
ご覧のとおり、C ++の方法はより簡潔であり、順序がすべてのインスタンスに適用できる場合は、個別に(通常はインラインフリー関数として)定義できます。この場合、次のようになります。
sort(info.begin(), info.end());
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加