3

大家好我可以使用向量而不是队列吗?我只想使用不同的线程在内存中推送和弹出。而且我还需要在弹出后删除数据。使用向量而不是队列有什么优势吗?

提前致谢....

4

6 回答 6

11

这是不明智的,因为队列是先进先出的,所以你需要从你推入的另一端弹出。为此,要使用的结构是std::deque,这是std::queue默认情况下在后台使用的结构。

于 2013-01-25T12:39:32.663 回答
4

向量类似于堆栈而不是队列。您只能从一侧推送和弹出,而不能从一侧推送并从另一侧弹出。向量将使您能够在恒定时间内通过其索引访问任意元素,但无法从其开头有效地删除元素。

于 2013-01-25T12:39:19.897 回答
4

将向量用于队列将强制您从向量的第一个位置插入或删除元素。向量包含在单个内存块中,这样的操作成本很高。队列可以更有效地实现。

于 2013-01-25T12:39:58.647 回答
3

如果队列生命周期很短或者如果您知道队列的最大大小,您“可以”在队列上使用向量。只需在其中使用一个向量 push_back,并保留“头”所在位置的索引。例如,如果我推回 3 个元素,并且我想弹出一个,我只需将我的“头”索引增加 1。

Chandler Carruth 在此视频中解释了这种技术: https ://youtu.be/fHNmRkzxHWs?t=2541

于 2020-02-28T15:19:10.397 回答
1

如果你真的需要一个 FIFO 的向量,你可以使用insert()and 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);
于 2018-03-09T23:29:46.583 回答
1

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

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

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

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

于 2021-08-05T20:35:15.730 回答