我可以使用C ++向量代替队列进行FIFO顺序

时间:2013-01-25 12:37:37

标签: c++

大家好我可以使用vector而不是队列吗?我只是想使用不同的线程来推送和弹出内存。而且我需要在pop之后删除数据。使用矢量队列是否有任何优势?

提前致谢....

6 个答案:

答案 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)

我有一个类似的用例,不同之处在于我只需要填充“队列”一次,然后我需要以添加元素的相同顺序消耗所有元素 ,然后我丢弃队列。

任何有类似情况的人都可以简单

  • 使用向量
  • 用一系列 push_back() 调用填充它
  • 然后按正常顺序使用条目(从 begin()end()
  • 然后只需clear()向量

我还没有测试过,但很快就会尝试。

答案 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);