什么是最适合将值推入顶部,从任何索引处删除并避免重新分配内存的容器?

问题描述 投票:0回答:2

我需要构建一种堆栈,在其中可以将值压入顶部:

5      // (size 1)
5 3    // (size 2)
5 3 8  // (size 3)

而不是按值删除它们,例如删除3:

5 8    // (size 2)

比在需要时总是能够获得最后一个值(即示例中的8)。

我最多可以推送32个值,所以我知道整体大小(避免堆?)。>

我认为std::vector带有:

  • 初始储备金(32)
  • 。push_back()用于插入
  • 用于按值删除的vector.erase(std :: remove(vector.begin(),vector.end(),value),vector.end())
  • vector [vector.size()-1以检索最后一个元素
  • 但是也许有一些stl容器更适合这种过程?不确定vector是否始终在堆栈中,并且会在后台进行进一步的内存重新分配...

我需要构建一种堆栈,在其中我可以将值压入顶部:5 //(大小1)5 3 //(大小2)5 3 8 // //(大小3)而不是按值删除它们,例如删除3:5 8 //(大小2)比...

c++ stl containers
2个回答
0
投票

您可以编写一个包含32个值的分配器,并拒绝分配32以外的任何金额>

template <typename T, std::size_t N = 32>
struct static_allocator 
{
    T* allocate(std::size_t n) { if (n != N) throw std::bad_alloc(); return arr; }
    void deallocate(T *, std::size_t) {}

    using pointer = T*;
    using const_pointer = const T*;
    using void_pointer = void*;
    using const_void_pointer = const void*;

    using value_type = T;
    using size_type = std::size_t;
    using difference_type = std::ptrdiff_t;

    template <typename U>
    struct rebind
    {
         using other = static_allocator<U, N>;
    };

    static_allocator select_on_container_copy_construction() { return {}; }
    using propagate_on_container_copy_assignment = std::true_type;
    using propagate_on_container_move_assignment = std::true_type;
    using propagate_on_container_swap = std::true_type;
private:
    T arr[N];
};

-1
投票

如果您不希望重新分配内存,则也可以使用列表容器,即链表..,因为它与矢量具有几乎相同的属性。只是不支持随机访问或[]运算符...其他矢量很完美: )

© www.soinside.com 2019 - 2024. All rights reserved.