我在std :: vector(population
中添加和删除元素时遇到了一些麻烦,在示例代码中)。我想要做的是在条件满足时擦除元素,如果满足其他条件则复制元素。这是代码:
for( int i = 0; i < walkers_num; i++) {
if( population[i].molteplicity == 0 ) {
population[i] = population.back();
population.pop_back();
i--;
} else {
for( int j = population[i].molteplicity; j > 1; j-- ) {
population.push_back(population[i]);
}
}
}
walkers_num = population.size();
我得到的是:
对象0x7f86a1404498的***错误:释放对象的校验和不正确 - 对象可能在被释放后被修改。
我想我正在以错误的方式使用一些std :: vector属性,因为一个非常相似的算法(概念上它们看起来与我相同)似乎可以工作,如果人口是std :: list:
list<Walker>::iterator it;
list<Walker>::iterator end = thread_population[i].end();
for ( it = thread_population[i].begin(); it != end; ) {
if( it->molteplicity == 0 ) {
it = thread_population[i].erase(it);
continue;
}
for( int j = it->molteplicity; j > 1; j-- ) {
population.push_back(*it);
}
++it;
}
walkers_num = population.size();
你能帮助我吗?
答案 0 :(得分:2)
你还没有发布足够多的代码。
我假设您在片段的开头省略了:
walkers_num = population.size();
正在尝试访问整个阵列。在这种情况下,尝试:
walkers_num = population.size();
for( int i = 0; i < walkers_num; i++) {
if( population[i].molteplicity == 0 ) {
population[i] = population.back();
population.pop_back();
i--;
--walkers_num; //Array has been shortened.
}
//....
您似乎已经意识到长度已经改变,因为您将walkers_num = population.size();
放在最后。你需要始终跟踪。
您的迭代器代码可能有效,但技术上同样无效,这有一些微妙的原因。修改后,您不能认为end
有效。