【问题标题】:Is there any way to fix the vector size So that it automatically deletes elements from front?有没有办法修复矢量大小以便它自动从前面删除元素?
【发布时间】:2018-03-31 08:43:51
【问题描述】:

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

这是我想要做的:

例如,在 Vectors (C++) 中是否有任何方法可以固定大小,以便我可以继续从一端推送和弹出元素,如果我推送的元素超过大小,它应该自动从前面删除旧元素.

如果不是向量,还有别的吗?

【问题讨论】:

  • Boost 库有 boost::circular_buffer
  • @jogojapan 谢谢! ,我想这正是我想要的。但是如果需要,我可以动态更改大小吗? .即,在使用大小 7 循环缓冲区一段时间后,如果我希望它调整大小以容纳 9 个元素并继续其行为,是否有可能?
  • 是的,当然。 Boost 版本有一个resize() 函数。如果您自己实现循环缓冲区,您只需确保使用大小灵活的底层数据结构,例如std::vector 而不是 std::array
  • @xskxzr:当心,这个问题的最高投票答案很糟糕(我只是投了反对票)。但是,接受的答案是正确的(所以我只是赞成)。

标签: c++ vector data-structures


【解决方案1】:

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 等操作允许哪些迭代器和对元素的引用变为无效?
  • 你的容器需要暴露被包装容器接口的哪些部分?它是否需要自己的迭代器类,是否必须使用基于范围的 for 循环等等。
  • 您是否希望允许最大大小为零,是否需要使用模板专业化或constexpr if 优化相应的检查?
  • 包装的容器类本身是否应该是模板参数,就像std::stack 一样?

大部分设计决策将取决于容器是用于库代码还是应用程序代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多