大家好我可以使用向量而不是队列吗?我只想使用不同的线程在内存中推送和弹出。而且我还需要在弹出后删除数据。使用向量而不是队列有什么优势吗?
提前致谢....
这是不明智的,因为队列是先进先出的,所以你需要从你推入的另一端弹出。为此,要使用的结构是std::deque
,这是std::queue
默认情况下在后台使用的结构。
向量类似于堆栈而不是队列。您只能从一侧推送和弹出,而不能从一侧推送并从另一侧弹出。向量将使您能够在恒定时间内通过其索引访问任意元素,但无法从其开头有效地删除元素。
将向量用于队列将强制您从向量的第一个位置插入或删除元素。向量包含在单个内存块中,这样的操作成本很高。队列可以更有效地实现。
如果队列生命周期很短或者如果您知道队列的最大大小,您“可以”在队列上使用向量。只需在其中使用一个向量 push_back,并保留“头”所在位置的索引。例如,如果我推回 3 个元素,并且我想弹出一个,我只需将我的“头”索引增加 1。
Chandler Carruth 在此视频中解释了这种技术: https ://youtu.be/fHNmRkzxHWs?t=2541
如果你真的需要一个 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);
我有一个类似的用例,不同之处在于我只需要填充“队列”一次,然后我需要按照添加的顺序使用所有元素,然后丢弃队列。
任何有类似情况的人都可以简单地
我还没有测试过,但很快就会尝试。