指针包装器插入

时间:2019-07-18 09:08:58

标签: c++ c++11 stl

有人可以告诉我C ++ / STL中是否有一种数据类型,它可以让我轻松地解决以下问题:

  • 我有一个预分配的连续内存区域,代表T类型的对象数组。
  • 我有一个指向该区域的原始指针ptrEnd,该指针指向该区域的最后一个对象。
  • 我有一个指针ptrCurrent指向该区域内的某个位置。

现在我想要的是某种包装器类,可以帮助我在该区域中插入新元素。它应该具有某种“附加”功能,基本上可以完成以下操作

  • 分配* ptr当前要插入的对象的值
  • 将ptrCurrent增加1。
  • 如果ptrCurrent> = ptrEnd,则省略上述步骤。而是返回一个错误(或一个false来指示失败)。

我可以自己编写类似的内容,但我想先问一下C ++ STL中是否有一个类可以让我更优雅地解决此问题。

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

在C ++ 17中,多态分配器有一个方便的功能。更具体地说,这就是您想要的:

pluginManagement {
    repositories { ... }
}

live godbolt.org example

答案 1 :(得分:0)

您需要编写一个Allocator来从数组中分发T,然后std::vector才能使用它。

template <typename T>
class ArrayAllocator
{
    T* current;
    T* end;
public:
    using value_type = T;

    ArrayAllocator(T* start, T* end) : current(start), end(end) {}

    T* allocate(size_t n)
    {
         if (current + n >= end) throw std::bad_alloc();
         T * result = current;
         current += n;
         return result;
    }

    void deallocate(T* what, size_t n)
    {
         if (what + n != current) throw std::runtime_error("bad deallocate");
         current = what;
    }

    size_t max_size() { return end - current; }
};

您必须立即reserve全部金额,因为vector重新分配时需要将旧值复制到新空间中,这将导致“不良分配”。

答案 2 :(得分:0)

我最终编写了一个AppendHelper类,该类带有开始和结束指针,否则将重现std :: vector接口。我意识到,使用带有自定义分配器的std :: vector意味着无法完全控制何时执行分配和释放,因此结果的行为可能与我的初衷不同。

相关问题