我有一个维护整数向量的程序。我有三个函数添加一个整数,删除一个整数并检查一个整数是否已经在向量中。问题出在最后一个问题上。
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]等循环,但无济于事。任何帮助,将不胜感激。谢谢。
答案 0 :(得分:2)
你的循环应该改变:
for (ic= children.begin(); ic < children.end(); ic++)
到此:
for (ic= children.begin(); ic != children.end(); ic++)
这不会解决问题,因为使用的容器是一个向量,并且为该容器类定义了向量的迭代器之间的差异。但是,优先选择仍然是一种好习惯,
ic != container.end()
因为这适用于缺乏该定义的容器。
答案 1 :(得分: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()
中的迭代器无效。这只有在没有正确静音的情况下使用线程时才有可能(在这种情况下你会遇到更大的问题:)