1

我有一个维护整数向量的程序。我有三个函数可以添加一个整数,删除一个整数并检查一个整数是否已经在向量中。问题出在最后一个。

vector<int> children;
void CtpTestingApplication::addChild(int child)
{
    for (int i=0; i<children.size(); i++)
    {
    //already a child
    if (children[i]==child)
        return;
    }
    //child not yet recorded
   children.push_back(child);
   cout<<"added child "<<child;
}

void CtpTestingApplication::removeChild(int child)
{
   for (int i=0; i<children.size(); i++)
   {
    //already a child, remove it
    if (children[i]==child)
    {
        children.erase(children.begin()+i);
        cout<<"removed child "<<child;
    }
   } 
   //not recorded, no need to remove
}

bool CtpTestingApplication::isChild(int child)
{
   vector<int>::iterator ic;
   bool result = false;
   for (ic= children.begin(); ic < children.end(); ic++)
   {
     cout<<*ic<<" vs "<<child;
  //     if (child==*ic)
         result = true;
   }
   return result;
}

当我取消注释“if (child==*ic)”时,我总是遇到分段错误,即使打印输出显示向量不为空并且包含预期的整数。

例如,如果注释了 if 语句,我可以看到 1 vs 4、2 vs 4、4 vs 4、12 vs 4

我还尝试使用 children[i] 等进行循环,但无济于事。任何帮助,将不胜感激。谢谢你。

4

2 回答 2

2

您的循环应该从此改变:

   for (ic= children.begin(); ic < children.end(); ic++)

对此:

  for (ic= children.begin(); ic != children.end(); ic++)

这不会解决问题,因为使用的容器是一个向量,并且为该容器类定义了向量迭代器之间的差异。但是,首选仍然是一个好习惯,

ic != container.end()

因为这适用于缺少该定义的容器。

于 2012-11-01T05:11:06.013 回答
1

正如 John3136 所指出的,我看到的唯一潜在问题是removeChild函数。尝试像这样重写它:

void CtpTestingApplication::removeChild(int child)
{
   int i=0; 
   while (i<children.size())
   {         
      if (children[i]==child) {
         children.erase(children.begin()+i);             
         continue;
      }
      i++;
   }        
}

为什么你得到段错误是任何人的猜测。一种可能性是removeChild()可以在其他线程中调用,从而使您的迭代器无效isChild()。这只有在你使用没有适当互斥的线程时才有可能(在这种情况下你有一个更大的问题:)

于 2012-11-01T05:11:57.633 回答