C++ std::deque pop_front()不删除队列中的元素

xqkwcwgp  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(159)

我正在为学校报告实现一个简单的基数排序,并在中间桶排序的实现中使用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++;
            }
        }
    }
}
62lalag4

62lalag41#

for (std::deque<Integer> bucket : buckets){

您的**bucket类型为std::deque<Integer>,正在for循环**中通过值传递。

for (std::deque<Integer>& bucket : buckets){

只需传递对**bucket**双端队列的引用即可。

说明:

当我们通过值***传递一个对象*时,将创建该对象的副本,对该副本所做的任何更改都不会影响原始对象。为了真正改变或影响原始对象,我们通过引用传递一个对象***。
在代码中,std::deque<Integer>类型的对象在for循环中通过值传递。它在你的
bucket变量中创建了一个副本,对bucket所做的任何更改都只会反映在副本中,而不会反映在你的buckets向量中的原始内容中。
使用
&操作符,可以通过引用传递std::deque<Integer>对象。这将在buckets向量中创建对原始双端队列的引用,对bucket**所做的任何更改都将反映在原始双端队列中。

相关问题