2015-03-03 4 views
1

У меня возникают проблемы с использованием std :: qsort на моем векторе объектов. (Обратите внимание, что этот код внутри цикла)C++ quicksort vector of objects

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 представляет собой просто структуру интегральных значений.

Заранее спасибо.

+2

У вас есть причины не использовать 'std :: sort'? Кроме того, первым параметром 'qsort' должен быть буфер с данными. Адрес вектора не будет. – juanchopanza

ответ

1

можно передать неправильные аргументы 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()); 
+0

Спасибо! Я не знал, что std :: sort на самом деле больше uptodate vs qsort. Infact У меня всегда было предположение, что qsort для stdlib. –

+1

@ChristopherLeong 'std :: sort' не является более актуальным,' std :: sort' является C++, 'qsort' является C – Slava