gpt4 book ai didi

c++ - 比较 vector 中的队列大小

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:33 25 4
gpt4 key购买 nike

已更新

有一个逻辑,其中一个整数之前被排入 vector 中的队列,搜索队列循环并将整数排入队列中具有最小大小的队列。下面的代码显示了操作

#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)

我正在尝试扩展这个逻辑,条件是整数应该继续在最短队列中排队当条件为真最短队列的大小小于或等于任何其他队列的队列循环中的大小。

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

#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(或者可能只有在弹出,myOrder( poppedIndex, myMap.front() )).

或者,您可以手动完成,并避开 map (但您必须保留两个变量):

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;
}

这可能比维护堆慢,但即使队列数量非常多,我不确定会有什么不同引人注目。

关于c++ - 比较 vector 中的队列大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14894658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com