比较矢量中的队列大小

comparing queue sizes in a vector

本文关键字:队列 比较      更新时间:2023-10-16

更新

具有一个逻辑,在该逻辑中,之前的整数被排队到向量中的队列中,搜索队列的循环,并将整数排队到队列中大小最小的队列中。以下代码显示操作

#include <vector> 
#include <queue> 
std::vector<std::queue<int> > q
int min_index = 0;
std::size_t size = q.size();
for( i=0; i<size; i++){ //accessing loop of queues
    if(q[min_index].size() > q[i].size())
        min_index = i; // Now q[min_index] is the shortest queue
} 
q[min_index].push(int)

我试图用一个条件来扩展这个逻辑,即整数应该继续在最短队列中排队,而条件为true,即最短队列的大小小于或等于队列循环中的任何其他队列的大小。

我想做一些类似下面显示的代码

#include <vector> 
    #include <queue> 
    std::vector<std::queue<int> > q
    int min_index = 0;
    std::size_t size = q.size();
    for( i=0; i<size; i++){ //accessing loop of queues
        if(q[min_index].size() > q[i].size())
            min_index = i
    while(q[min_index].size <= q[some_other_index].size() )
    {
        q[min_index].push(int);
}

如何实现这个逻辑?

最干净的解决方案需要C++11:

std::min_element( 
        q.begin(),
        q.end(),
        []( std::queue<int> const& lhs, std::queue<int> const& rhs)
            { return lhs.size() < rhs.size(); } )
    ->push(value);

即使没有C++11,我想我也会写一个小的谓词类做lambda所做的,并使用它。

编辑:

现在我对想要什么有了更好的想法像以下应该做的技巧:

class OrderInMap
{
    MultiQueue* myOwner;
public:
    OrderInMap( MultiQueue* owner )
        : myOwner( owner )
    {
    }
    bool operator()( int lhs, int rhs ) const
    {
        return myOwner->myQueues[ lhs ].size()
                < myOwner->myQueues[ rhs ].size();
    }
};
std::vector <std::queue<int>> myQueues;
std::vector <int> myMap;
int myCurrent;
bool myOrderIsValid;
OrderInMap myOrder;
int getIndexForPush()
{
    if ( ! myOrderIsValid || myOrder( myMap[0], myCurrent ) ) {
        myMap.push_back( myCurrent );
        std::push_heap( myMap.begin(), myMap.end(), myOrder );
        std::pop_heap( myMap.begin(), myMap.end(), myOrder );
        myCurrent = myMap.back();
        myMap.pop_back();
    }
    return myCurrent;
}

由于弹出可以更改顺序,您必须设置弹出时myOrderIsValid为false(或者可能仅当pop、myOrder( poppedIndex, myMap.front() ))。

或者,你可以用手做,避开地图(但你必须保留两个变量):

int myCurrent;
int myNext;
void order()
{
    if ( myQueues[myNext].size() < myQueues[myCurrent].size() ) {
        std::swap( myNext, myCurrent );
    }
}
int getQueueIndex()
{
    if ( ! myOrderIsValid || myQueues[myNext].size() < myQueues[myCurrent].size() ) {
        myCurrent = 0;
        myNext = 1;
        order();
        for ( int i = 2; i < myQueues.size(); ++ i ) {
            if ( myQueues[i].size() < myQueues[myNext].size() ) {
                myNext = i;
                order();
            }
        }
    }
    return myCurrent;
}

这可能比维护堆慢,但即使排队的人很多,我不确定会有什么不同引人注目。