2015-03-03 60 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