大家好我可以使用vector而不是队列吗?我只是想使用不同的线程来推送和弹出内存。而且我需要在pop之后删除数据。使用矢量队列是否有任何优势?
提前致谢....
答案 0 :(得分:10)
这不明智,因为队列是FIFO,所以你需要从你推入的另一端弹出。为此,要使用的结构是std::deque
,这是std::queue
默认使用的结构。
答案 1 :(得分:4)
使用vector for queue将强制您插入或删除vector的第一个位置的元素。向量包含在单个存储器块中,并且这种操作是昂贵的。队列可以更有效地实施。
答案 2 :(得分:3)
如果队列寿命很短或知道队列的最大大小,则可以在队列上使用向量。只需使用一个向量,在其中使用push_back,并保留“头部”位置的索引。 例如,如果我后退3个元素,并且想弹出一个元素,我将“ head”索引增加一个。
此技术由钱德勒·卡鲁斯(Chandler Carruth)在此视频中进行了解释: https://youtu.be/fHNmRkzxHWs?t=2541
答案 3 :(得分:2)
向量类似于堆栈而不是队列。你可能只能从一侧推出弹出而不是从另一侧弹出而从另一侧弹出。向量将使您能够在常量时间内通过索引访问任意元素,但无法从其开头有效地删除元素。
答案 4 :(得分:1)
我有一个类似的用例,不同之处在于我只需要填充“队列”一次,然后我需要以添加元素的相同顺序消耗所有元素 ,然后我丢弃队列。
任何有类似情况的人都可以简单
我还没有测试过,但很快就会尝试。
答案 5 :(得分:0)
如果您确实需要FIFO的矢量,可以使用insert()
和pop_back()
。
std::vector<glm::vec3> m_vertices;
glm::vec3 point1 = glm::vec3();
glm::vec3 point2 = glm::vec3();
m_vertices.insert(m_vertices.begin(), point1) ;
m_vertices.pop_back();
m_vertices.insert(m_vertices.begin(), point2);