矢量与显式调整大小

时间:2013-04-11 10:00:02

标签: c++ vector

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

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

有没有办法使用矢量或其他数据结构?我可以使用C99可变长度数组,如果是这样,我如何在构造函数中将其初始化为正确的长度?或者我是否需要推出自己的显式可调整大小的矢量?

2 个答案:

答案 0 :(得分:2)

如果检查了你保留的空间,你可以简单地解决这个问题“在这种情况下,我希望向量断​​言或抛出异常而不是试图静默调整大小。”与

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是一个对象)。

答案 1 :(得分:1)

继承是你的朋友:

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);
    }
};