具有显式调整大小的向量
Vector with explicit resizing
我使用的是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);
}
};
相关文章:
- 在C++中调整向量中的索引
- 将 boost::odeint 与向量类一起使用,而无需调整向量的大小
- 如何按另一个向量的方向调整一个向量?
- C++初始化列表中的向量集大小或调整大小
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- 调整向量大小并检索值,这是否正确或在任何情况下都可能导致段错误?
- 如何调整作为结构或类成员的向量的大小?
- 调整STD ::向量的大小是否可以降低其能力
- 在具有容量/调整大小的类中初始化向量
- STD ::向量如何调整其内部缓冲区大小
- 将添加的列初始化为可调整大小的 2D 向量
- C++中向量容器的大小和调整大小函数
- 如何判断 std::vector 是否调整了自身大小,以及如何解释指向向量内值的指针不再有效
- 调整OpenCV Mat向量向量的大小时出乎意料的结果
- C++有没有一种方法可以将向量调整为特定的字符
- 如何调整结构向量的大小
- 犰狳与 Boost Odeint 冲突:Odeint 在集成期间将状态向量调整为零
- 调整C 的2D向量大小,并填充0
- BAD_ALLOC错误实现向量调整大小函数时
- 如何在使用向量调整大小时调用非默认构造函数