【发布时间】:2015-07-13 09:25:51
【问题描述】:
我被要求在 C++ 中实现一个采用未指定类型的循环缓冲区。我假设泛型类型是原始类型。 (还是应该考虑非原始类型?)对于缓冲区,我使用 basic 数组,例如T[] 用 new 和 delete 来初始化和销毁它。
我已经实现了缓冲区类并在具有预期输出的整数上对其进行了测试。但它不适用于std::string。问题是,当我弹出缓冲区时,我通过将元素设置为零来清除元素,编译器抱怨这样做是模棱两可的。因此,我需要一种通用的方法来清除元素,并且我认为 std::array 可能支持此功能,但我在文档中找不到它。
是否有一种通用的方法来清除 std::array 或基本数组中的元素,或者 std::allocator 是我唯一的选择?或者,如果我完全走错了方向,我应该如何实现 pop 方法来重置第一个元素并将前面的索引增加到下一个元素的索引?
提前致谢!
如果有帮助,下面是我的相关代码:
template<class T> T CircularBuffer<T>::pop_front()
{
if (_size == 0)
return 0;
T value = buffer[_front];
buffer[_front] = 0;
if (--_size == 0)
{
_front = -1;
_back = -1;
}
else
{
_front = (_front + 1) % _capacity;
}
return value;
}
【问题讨论】:
-
std::deque 应改为使用。 C++ 中没有引用类型。如果您认为
class是引用类型而struct是值类型,那么不,事实并非如此。 -
@Jagannath 感谢您指出这一点!我已经改写为 primitive(我所说的值类型)和 non-primitive(我所说的引用类型)。
-
所以,答案是std::deque。
-
您可以将
T()分配给元素,或者使用放置新的和显式的析构函数调用。后者更正确;前者更容易写。 -
@Jagannath 我猜 OP 希望 circular buffer 固定大小。所以没有双端队列。
标签: arrays c++11 circular-buffer stdarray