我正在使用矢量,但出于多种原因,使用指针指向各个元素。问题是,当我添加元素时,向量会调整大小并可能将元素移动到另一个更大的内存地址。这使我的指针无效。
为了避免重新分配,我在使用向量之前调用vector<T>::reserve
。但是有些情况下我没有预留足够的空间。在这个例子中,我希望向量断言或抛出异常,而不是试图静默调整大小。
有没有办法使用矢量或其他数据结构?我可以使用C99可变长度数组,如果是这样,我如何在构造函数中将其初始化为正确的长度?或者我是否需要推出自己的显式可调整大小的矢量?
答案 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);
}
};