我正在为学校报告实现一个简单的基数排序,并在中间桶排序的实现中使用std::deque。问题是,当我执行pop_front()时,front元素没有被删除。我尝试使用clear()和empty(itr)操作来解决这个问题,但是在这两种情况下,队列中的数据都没有被删除。我已经验证了在使用GDB的所有3种情况下,数据都没有从队列中删除。这打乱了整个排序,因为每个数字排序的元素都在队列中结束,然后进入排序列表。
我解决这个问题的方法是在digitCount for循环的每次迭代中重新分配所有10个队列。但这增加了本不应该存在的开销。
Integer类只是对每个数字中的数字列表和该数字的数值表示的 Package 。
我做错了什么,导致元素没有从队列中弹出?
void SerialRadix::radixSort(){
//todo: add support for numbers of varying lengths
std::vector<std::deque<Integer> > buckets;
//populate m_buckets with queues
for (int j = 0; j < 10; j++){
std::deque<Integer> bucket;
buckets.push_back(bucket);
}
const int digitCount = m_integers[0].getDigitCount();
int digitValue; //used in loop
// look at all digits in each number. 'i' is the digit location. digits in ascending order, loop in reverse
for (int i = digitCount - 1; i >= 0; i--){
// loop over all numbers in list
for (Integer numToSort : m_integers){
digitValue = numToSort.m_digits[i];
//place number in bucket based on digit value
buckets[digitValue].push_back(numToSort);
}
int index = 0;
// empty buckets back into sorted list
for (std::deque<Integer> bucket : buckets){
while (!bucket.empty()){
m_integers[index] = bucket.front();
bucket.pop_front(); //!problem is here! not removing from queue
// if this is last digit to sort, place into sorted list when pulled from bucket
if (!i){
m_sortedList[index] = m_integers[index].getNumber();
}
index++;
}
}
}
}
1条答案
按热度按时间62lalag41#
您的**
bucket
类型为std::deque<Integer>
,正在for循环**中通过值传递。只需传递对**
bucket
**双端队列的引用即可。说明:
当我们通过值***传递一个对象*时,将创建该对象的副本,对该副本所做的任何更改都不会影响原始对象。为了真正改变或影响原始对象,我们通过引用传递一个对象***。
在代码中,
std::deque<Integer>
类型的对象在for循环中通过值传递。它在你的bucket
变量中创建了一个副本,对bucket
所做的任何更改都只会反映在副本中,而不会反映在你的buckets
向量中的原始内容中。使用&操作符,可以通过引用传递
std::deque<Integer>
对象。这将在buckets
向量中创建对原始双端队列的引用,对bucket
**所做的任何更改都将反映在原始双端队列中。