2015-03-03 61 views
1

我在使用std :: qsort對象的向量時遇到了麻煩。 (請注意,此代碼是一個循環內)C++ quicksort對象向量

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。 lambda有什麼問題嗎?或者還有另外一個要求像使用賦值運算符重載一樣使用qsort。但s_GridData只是一個整數值的結構。

在此先感謝。

+2

你有什麼理由不使用'std :: sort'嗎?而且,'qsort'的第一個參數應該是一個包含數據的緩衝區。矢量的地址不會。 – juanchopanza 2015-03-03 12:48:54

回答

1

你傳遞了​​錯誤的參數qsort()(這是一個真正的C函數不namespace std原):

std::qsort(&info, ... 

右鍵關閉這是錯誤的蝙蝠,因爲infostd::vectorqsort()需要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實際上比qsort更多。事實上,我總是假設qsort是針對stdlib的。 – 2015-03-03 13:16:32

+1

@ChristopherLeong'std :: sort'不是最新的,'std :: sort'是C++,'qsort'是C – Slava 2017-07-03 16:34:57