如何在插入函数中避免指针失效?

时间:2010-10-03 21:02:46

标签: c++

在我的数据结构课程中,我们正在创建一个基本的矢量类。在我的标题中,有一个成员函数,用于将新值插入向量中。如果我的向量的容量大到足以插入一个值,程序运行正常。但是,如果向量需要增长,我会遇到指针错误。经过几个小时试图弄清楚发生了什么,我相信我遇到了使迭代器无效的问题。

这是我的插入功能和保留功能:

// 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”迭代器无效。我怎样才能解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

pos迭代器改为索引,然后使用它。

size_t index = pos - begin();
// do resize
pos = begin() + index;

如果您担心迭代器通常会失效,请不要。这是不可避免的,至少在这种动态数组中,std::vector的工作方式完全相同。