[英]Ascending sort, c++, with vectors
我試圖做一個排序函數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;
}
}
}
}
}
很難理解這種方法的理想順序。 但是我會努力的。 你用
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())
在else語句之后
if (Queue.empty())
這是太多的檢查,可能會導致許多錯誤......
我相當肯定,根據您在評論中提供的提示,這就是您想要的。 它不需要處理空列表或負數特殊。 如果沒有在for循環中插入value
,則假定它在最后。
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);
}
}
這將可靠地按降序順序插入元素,而無需特殊處理負數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.