我正在进行编程练习,并且在编写要在列表中排序的函数时遇到了一些麻烦: 我有以下代码:
void Node::insertNew(Object* obj) {
list<Object*>::iterator iter = listObjects.begin();
while (it != listObjects.end() && (*it)->getFrecuency() > obj->getFrecuency()) {
it++;
}
if (it != listObjects.end() && (*it)->getFrecuency() != obj->getFrequency()) {
while (it != listObjects.end() && (*it)->getName() < obj->getName()) {
it++;
}
listObjects.insert(it, obj);
}
}
我希望插入排序,首先是Frecuency(从最高到最低),如果是平局,按名称排序(按字母顺序从最低到最高)。 但我确信我做错了什么。 希望你能帮助我,抱歉英语不好。 感谢。
答案 0 :(得分:1)
你的第二个循环说“如果频率不同,开始比较名称(忽略频率),直到你找到插入点”。
您想要找到频率较小的第一个元素或具有相同的频率且名称不小于:
while (it != listObjects.end()
&& ((*it)->getFrequency() > obj->getFrequency()
|| ((*it)->getFrequency() == obj->getFrequency()
&& (*it)->getName() < obj->getName()))) {
it++;
}
listObjects.insert(it, obj);
重载<
运算符使其更方便。
bool operator< (const Object& lhs, const Object& rhs)
{
return lhs.getFrequency() > rhs.getFrequency()
|| (lhs.getFrequency() == rhs.getFrequency() && lhs.getName() < rhs.getName());
}
// ...
while (it != listObjects.end() && **it < *obj)
it++;
listObjects.insert(it, obj);