具有显式调整大小的向量

Vector with explicit resizing

本文关键字:向量 调整      更新时间:2023-10-16

我使用的是vector,但出于多种原因,我使用指针来引用单个元素。问题是,当我添加元素时,向量会调整大小,并可能将元素移动到另一个更大的内存地址。这将使指针失效。

为了避免重新分配,我在使用矢量之前调用vector<T>::reserve。然而,在某些情况下,我没有保留足够的空间。在这种情况下,我希望向量断言或抛出异常,而不是试图静默地调整大小。

是否有任何方法可以使用向量或其他数据结构来做到这一点?我可以使用C99可变长度数组,如果可以,我如何在构造函数中初始化一个正确的长度?或者我需要推出我自己的明确的可调整大小的向量?

如果您检查保留了多少空间,则可以使用

简单地解决"在这种情况下,我希望向量断言或抛出异常,而不是试图静默地调整大小"的问题。
if (v.size() == v.capacity()) throw ... 

你可以这样写一个函数:

template <typename T>
void safe_vector_push_back(std::vector<T>& v, const T &e)
{
   if (v.size() == v.capacity()) throw ... 
   v.push_back(e);
}

另一种可能的方法当然是根本不存储指向vector对象内容的指针。只要将索引存储到向量中。这样,向量就可以随心所欲地调整大小,不会出错。

将指向数据的指针存储在另一个对象中通常不是一个好主意(在这种情况下,vector是一个对象)。

继承是你的朋友:

template<typename T, typename A = std::allocator<T>>
class myvector : public std::vector<T, A>
{
    typedef std::vector<T,A> base_t;
public:
    myvector()
    {
    }
    myvector(size_t size) : base_t(size)
    {
    }
    void push_back(T val)
    {
        if(capacity() == size())
            throw "no more room";
        base_t::push_back(val);
    }
};