【问题标题】:C++ vector or Queue to build large Q in term of memory and speedC++ 向量或队列在内存和速度方面构建大 Q
【发布时间】:2026-01-14 02:00:01
【问题描述】:

我正在构建一个大型消息队列并仅使用 PUSH 和 POP,这样可以更有效(向量或队列)以最大速度维护大型数据

struct MQStruct {
    wchar_t *serviceName; 
    int durability; 
    int msgType; 
    int msgHeader; 
    wchar_t *msgId; 
    wchar_t *payload; 
    int payloadSize; 
    int ttl; 
    int priority;
}MQStructObj;

vector<MQStruct> MQvector;
queue<MQStruct> MSQ;

int SendMessage(wchar_t *serviceName, int durability, int msgType, int msgHeader, wchar_t *msgId, wchar_t *payload, int payloadSize, int ttl, int priority) {

MQStructObj.serviceName=serviceName;
MQStructObj.durability=durability;
MQStructObj.msgType=msgType;
MQStructObj.msgHeader=msgHeader;
MQStructObj.msgId=msgId;
MQStructObj.payload=payload;
MQStructObj.payloadSize=payloadSize;
MQStructObj.ttl=ttl;
MQStructObj.priority=priority;

    //Which one is better (Vector or Queue) in term of memory, speed and why

MSQ.push(MQStructObj);

    //OR

MQvector.push_back(MQStructObj);


return 0;
}

【问题讨论】:

  • 队列是一个适配器,它使用下面的其他容器之一...en.cppreference.com/w/cpp/container/queue
  • std::vector 根本不适合排队,你确定要这个吗?
  • @Gorpik:是的,只是想确定一下。谢谢你的回答顺便说一句:)
  • 哪个容器取决于您需要的特性 - 如果您将 N 个项目排入队列,那么所有容器将容纳 N 个项目(内存)...队列默认使用 Deque。速度方面将取决于“pop/push”的实际工作方式。您最好的选择是分析不同的结构 - 也许使用默认的 Deque 最适合您?但这取决于您的具体要求
  • 制作两个程序,每种方法一个,并分别进行基准测试。比较结果。

标签: c++ performance vector queue


【解决方案1】:

使用std::vector,您无法有效地模拟队列 - 您只能从容器的一侧推送和弹出。如果你需要实现一个消息queue然后使用一个队列,这就是它的意思。

【讨论】:

    【解决方案2】:

    SO上有很多关于队列/向量/列表的讨论,您可以搜索和重用资源。简而言之:

    • 使用std::queue:如果您需要在开头和开头快速插入和删除 结束;
    • 如果您需要随机访问元素,请使用std::vector
    • 当中间有频繁的插入和删除时 你需要的序列std::list

    由于您只使用推送/弹出到容器,std::queue 肯定是代替std::vector 的方式。

    您可以从:http://en.cppreference.com/w/cpp/container获取更多详细信息

    【讨论】:

    • 事实上,std::queue(默认使用std::deque)甚至更好,因为它为 OP 的目的提供了更自然的界面,并且对于直接的std::deque 应该没有性能损失。
    • 非常感谢您的详细解释,我不需要在两端插入和删除,所以参考您的 ans,std::queue 对我来说是更好的选择
    • @Shahzad 对。改用 std::queue,我已经相应地更新了我的答案