在我的数据结构课程中,我们正在创建一个基本的矢量类。在我的标题中,有一个成员函数,用于将新值插入向量中。如果我的向量的容量大到足以插入一个值,程序运行正常。但是,如果向量需要增长,我会遇到指针错误。经过几个小时试图弄清楚发生了什么,我相信我遇到了使迭代器无效的问题。
这是我的插入功能和保留功能:
// Insert "item" before "pos", and return iterator referencing "item"
iterator insert (iterator pos, const T& item)
{
if (m_size == m_capacity)
{
reserve(m_capacity * 2);
}
T * endOfArray = (end());
while (endOfArray != pos)
{
*(endOfArray) = *(endOfArray - 1);
--endOfArray;
}
++m_size;
*pos = item;
return (pos);
}
void reserve (size_t space) {
if (space < m_capacity)
{
return;
}
T *temp_array = new T[space];
std::copy(begin(), end(), temp_array);
m_array = new T[space];
std::copy(temp_array, (temp_array + m_size), m_array);
m_capacity = space;
delete [] temp_array;
}
如您所见,如果insert函数调用向量的容量增加,则“pos”迭代器无效。我怎样才能解决这个问题呢?
答案 0 :(得分:2)
将pos
迭代器改为索引,然后使用它。
size_t index = pos - begin();
// do resize
pos = begin() + index;
如果您担心迭代器通常会失效,请不要。这是不可避免的,至少在这种动态数组中,std::vector
的工作方式完全相同。