比较矢量中的队列大小
comparing queue sizes in a 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)
我试图用一个条件来扩展这个逻辑,即整数应该继续在最短队列中排队,而条件为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;
}
这可能比维护堆慢,但即使排队的人很多,我不确定会有什么不同引人注目。
相关文章:
- 带自定义比较器的最小优先级队列
- 优先级队列自定义比较器
- 优先级队列功能比较
- Cython中带有自定义比较器的优先级队列
- 优先级队列比较器[C++].
- unique_ptr比较器的优先级队列
- GCC中优先级队列的奇怪shared_ptr比较器选择
- 排序函数和优先级队列 C++ 中的比较器
- 使用 lambda 比较初始化优先级队列的方法
- 优先队列的自定义比较器
- 优先队列中比较函数的工作
- 比较优先队列中的参数
- 比较优先队列的类
- 如何使用将 const int 的运算符用作 int* 优先级队列的比较器
- 优先队列中的结构比较
- C++ 具有自定义比较函数的优先级队列在 push() 上行为不正确
- 提升优先级队列比较功能
- 通过使用两个不同的队列比较字符串
- 优先级队列比较
- 访问类的私有成员的自定义优先级队列比较器