c++ - 有没有办法固定 vector 大小,以便它自动删除前面的元素?

标签 c++ vector data-structures

在决定定义自己的数据结构之前,我正在尝试找出最好的 C++ 容器。

这是我正在尝试做的事情: enter image description here

例如,在 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/

相关文章:

java - 使用 C++ 中的库为 PhoneGap 创建插件

c++ - atoi(textline[c]) 遍历 getline?

c++ - 显示基于 1 种类型的结构 vector 值

r - 编写一个将向量作为输入、丢弃不需要的值、删除重复项并返回原始向量的相应索引的函数

java - 如何访问Java LinkedList节点的私有(private)字段?

c++ - 使用 C++ 替换字符串文字中的几个字符

c++ - 抛出多个相同类型的异常

c++ - 对 3D vector 对进行排序

java - 如何创建保持相同顺序的链接列表的深拷贝

c - 将数据插入到 trie 中