我正在尝试为std::vector
创建排序函数,但是我对负数values
有疑问。我不想使用功能vector::sort
。
队列是一个向量。
我的输入:
1, -2, -241, 332, 2667, -2667, 266217, 2667, 13, -22, -41, 2332
输出:
266217, 2667, 2667, 2332, 332, 13, 1, -2. -241, -2667, -22, -41
基本上一切正常,然后由于不清楚的原因而崩溃。
功能:
void PriorityQueue::Push(double value)
{
std::vector<double>::iterator pr;
if (Queue.empty())
{
Queue.push_back(value);
}
else if (!Queue.empty())
{
for (pr = Queue.begin(); pr != Queue.end(); pr++)
{
if (value > *pr || value == *pr)
{
Queue.insert(pr, value);
break;
}
else if (value < 0)
{
if (value > *pr || value == *pr)
{
Queue.insert(pr, value);
break;
}
else if (value < *pr)
{
Queue.push_back(value);
break;
}
}
}
}
}
答案 0 :(得分:1)
用这种方法很难理解所需的顺序。但是我会尝试。您使用
Queue.insert(pr, value);
因此,我假设在大小写值> = * pr时pr应该在值之前。这意味着从最大到最小的降序。
您要降序排列。然后,当前一个值大于或等于而当前元素小于值时,则需要位置。因此,请跳过所有操作,直到找到该位置,然后再插入。
void PriorityQueue::Push(double value) {
std::vector<double>::iterator pr;
if (Queue.empty()) {
Queue.push_back(value);
return;
}
for (pr = Queue.begin(); pr != Queue.end(); pr++) {
if (value < *pr)
continue;
Queue.insert(pr,value);
break;
}
}
对于升序,请先跳过所有内容,直到更大为止,然后插入:
void PriorityQueue::Push(double value) {
std::vector<double>::iterator pr;
if (Queue.empty()) {
Queue.push_back(value);
return;
}
for (pr = Queue.begin(); pr != Queue.end(); pr++) {
if (value >= *pr)
continue;
Queue.insert(pr,value);
break;
}
}
您不需要检查“ if(value <0)”-我认为您的逻辑错误是在此步骤中犯的。另外,您不需要检查
if (!Queue.empty())
之后的其他声明中
if (Queue.empty())
这是太多检查,可能会导致许多错误...
答案 1 :(得分:1)
根据您在评论中给出的提示,我很确定,这就是您想要的。不需要对空列表或负数进行特殊处理。如果value
没有插入for循环中,则假定它位于末尾。
void PriorityQueue::Push(double value)
{
bool inserted = false;
for (auto pr = Queue.begin(); pr != Queue.end(); pr++)
{
if (value >= *pr)
{
Queue.insert(pr, value);
inserted = true;
break;
}
}
if (inserted == false) // handle the case of inserting a number at the end
{
Queue.push_back(value);
}
}
这将可靠地按降序插入元素,而无需特殊处理负数。