我正在为路由器(又名网关)编写代码,并且在接收和发送数据包时,我需要使用一种可以支持路由器逻辑的容器。当接收到一个数据包时,我想把它放在动态容器的末尾(这里称为 DC)。当将数据包从 DC 中取出进行处理时,我想从 DC 的前面取出它。
关于使用哪一个有什么建议吗?
我听说向量是个好主意,但我不太确定它们是否是动态的..
编辑:它应该包含的元素类型是“unsigned char *”类型的原始数据包。我将如何为 DC 编写包含这种类型的代码?
我正在为路由器(又名网关)编写代码,并且在接收和发送数据包时,我需要使用一种可以支持路由器逻辑的容器。当接收到一个数据包时,我想把它放在动态容器的末尾(这里称为 DC)。当将数据包从 DC 中取出进行处理时,我想从 DC 的前面取出它。
关于使用哪一个有什么建议吗?
我听说向量是个好主意,但我不太确定它们是否是动态的..
编辑:它应该包含的元素类型是“unsigned char *”类型的原始数据包。我将如何为 DC 编写包含这种类型的代码?
std::deque<unsigned char *>
这里是显而易见的选择,因为它支持高效的 FIFO 语义(使用push_back
and pop_front
, or push_front
and pop_back
,性能应该是一样的)。
以我的经验std::queue
(这是一个通常构建的容器适配器std::deque
)不值得付出努力,它只会限制界面而不会添加任何有用的东西。
对于路由器,您可能应该使用固定大小的自定义容器(可能基于 std::array 或 C 数组)。然后,您可以引入一些逻辑以允许将其用作循环缓冲区。固定大小非常重要,因为您需要处理数据包传入速度快于发送速度的情况。当你达到你的尺寸限制时,你就会流走。
使用动态调整大小的容器,您最终可能会耗尽内存或将不可接受的延迟量引入系统。
您可以使用std::queue
. 您在末尾使用插入元素并使用push()
从前面删除元素pop()
。front()
返回前面的元素。
要存储unsigned char*
元素,您需要像这样声明一个队列:
std::queue<unsigned char*> packetQueue;