在决定定义自己的数据结构之前,我正在尝试找出最好的 C++ 容器。
例如,在 vector (C++)中,有没有办法修复大小,以便我可以继续从一端推送和弹出元素,如果我推送的元素多于大小,它应该自动从前面删除旧元素.
如果不是 vector ,还有其他什么吗?
最佳答案
C++ 标准库中没有这样的容器,但您可以通过包装现有容器轻松创建自己的容器。 std::deque
可能是合适的,因为它的设计目的是允许在两端快速插入和删除。
template <class T, int MaxSize>
class CircularContainer
{
static_assert(MaxSize >= 0);
public:
void Add(T const& t)
{
if (MaxSize > 0)
{
if (size(data) == MaxSize)
{
data.pop_front();
}
data.push_back(t);
}
}
// ...
private:
std::deque<T> data;
};
这里需要做出很多设计决策,例如:
- 最大大小应该完全静态,在构造函数中设置,或者即使在创建容器对象之后也可以修改?
- 哪些迭代器和对元素的引用可以通过
Add
等操作变得无效? - 您的容器需要公开包装容器接口(interface)的哪些部分?它是否需要自己的迭代器类,是否必须与基于范围的
for
循环一起使用,等等。 - 您是否希望允许最大大小为零,是否需要使用模板专门化或
constexpr if
来优化相应的检查? - 包装的容器类本身是否应该是一个模板参数,就像
std::stack
那样?
大多数设计决策将取决于容器是在库代码中还是在应用程序代码中使用。
关于c++ - 有没有办法固定 vector 大小,以便它自动删除前面的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585952/