Код: Выделить всё
typedef struct {
std::string path;
boolean isDrive;
} DRIVE_OR_DIR
< /code>
Идея состоит в том, что элементы должны быть отсортированы как, например, < /p>
C: isDrive=true
C:\Dir1 isDrive=false (directory, follows parent drive)
D: isDrive=true
E: isDrive=true
function:
Код: Выделить всё
bool CompareItems(const DRIVE_OR_DIR& a, const DRIVE_OR_DIR& b) {
// Drive-vs.-Dir tiebreaker
if (a.isDrive && !b.isDrive || !a.isDrive && b.isDrive) {
if (a.isDrive) { // BLOCK 1
return (strcmp(a.path.c_str(), b.path.c_str()) < 0) ? true : false;
} else { // BLOCK 2
return (strcmp(b.path.c_str(), a.path.c_str()) < 0) ? true : false;
}
else {
// Like items
return (strcmp(a.path.c_str(), b.path.c_str()) < 0) ? true : false;
}
}
< /code>
В отладчике я вижу: < /p>
1. a = C:
b = C:\\MyDir1
Result = true
2. a = C:\\MyDir1
b = C:\\
Result = true
Я получаю ошибку недействительного компаратора .
Но это правильное поведение. Они оба верны, потому что они выполняются в разных условиях. В одном случае A.IsDrive действует, а в другом - действует. Если эти два элемента сравнивались в любом порядке, они не должны быть повторно подготовлены, но если они есть, результаты, как и ожидалось.
Подробнее здесь: https://stackoverflow.com/questions/796 ... oth-orders