1

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

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

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

4

2 回答 2

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

另一种可能的方法当然是根本不将指向内容的指针存储在向量中。只需将索引存储到向量中。这样,向量可以随意调整大小,不会出错。

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

于 2013-04-11T10:07:07.890 回答
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);
    }
};
于 2013-04-11T13:50:40.990 回答