【问题标题】:Checking if vector 'space' in vector<vector<queue<msg>>> is empty检查 vector<vector<queue<msg>>> 中的向量“空间”是否为空
【发布时间】:2013-03-12 02:53:39
【问题描述】:

我正在玩容器,目前正在尝试使用vector&lt;vector&lt;queue&lt;int&gt;&gt;&gt;。这个容器的形式是这样的,“第一个”向量的索引是客户端 ID,“第二个”向量的索引是优先级。即int 类型的消息被推送到某个优先级的queue 中,属于某个客户端。

我试图找到一种简单的方法来确定客户端是否有任何消息,即它的任何优先级是否有一个非空队列。我用这段简单的代码来说明我想要做什么:

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int main()
{

    vector<vector<queue<int>>> node_pri_msg;
    queue<int> pri_msg;

    node_pri_msg.resize(2);
    node_pri_msg[1].resize(2);
    node_pri_msg[0].resize(2);

    for (int i=0; i<2; i++)
    {
        node_pri_msg[i].push_back(pri_msg);
    }

    node_pri_msg[0][1].push(3);

    if (node_pri_msg[1].empty())
    {
        cout << "empty-check succeeded" << endl;
    }
}

但它不起作用,即它似乎认为node_pri_msg[1] 是非空的,尽管在任何“属于”它的队列中都没有消息。有没有简单的方法可以做到这一点?

【问题讨论】:

  • 它不是空的。你用node_pri_msg[1].resize(2)这一行将它调整为两个元素,然后用你的for循环再推一个。你可能想再想想你想做什么。你知道你问的是向量有多少个队列,(你刚刚设置为两个),而不是每个队列中有多少项目,对吧?
  • 我调整了它们的大小,因为否则我无法将整数推入队列 - 我认为它们将使用 NULL 元素进行初始化,此时 .empty() 会有所帮助。这是一个错误的假设?
  • 那将是一个错误的假设。调整矢量的大小将根据需要创建对象以填充调整大小(或者在您向下调整大小的情况下销毁它们,顺便说一句)。
  • 所以只是澄清一下:1. 我不能在不先调整向量大小的情况下将元素推入队列,以及 2. 一旦我调整了它们的大小,就没有简单的方法来查看队列是否为空。因此,向量的向量不起作用?
  • 队列可能为空。这不是您在触发 .empty() 方法时要问的问题。您在询问 hold 队列的向量是否为空,而它不是。它可能有一千个空队列,但这仅意味着向量不为空(有一千个队列)所有队列的总和状态并不是您使用当前代码得到的答案。从您的问题描述来看,我可能会使用std::map&lt;&gt; 作为第二层(也可能是第一层)。

标签: c++ vector stl queue containers


【解决方案1】:

我认为你会得到更好的服务:

#include <iostream>
#include <queue>
#include <map>

using namespace std;

int main()
{
    typedef std::queue<int> MessageQueue;
    typedef std::map<int, MessageQueue> PriorityMap;
    typedef std::map<int, PriorityMap> ClientMap;

    ClientMap clients;

    clients[10][1].push(1);
    clients[10][1].push(2);
    clients[11][2].push(3);

    cout << boolalpha;
    cout << clients[1].empty() << endl;
    cout << clients[10].empty() << endl;
    cout << clients[10][0].empty() << endl;
    cout << clients[10][1].empty() << endl;
    cout << clients[10][1].size() << endl;

    return 0;
}

输出

true
false
true
false
2

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多