擦除和向std :: vector添加元素的问题

时间:2015-06-16 06:46:32

标签: c++ stdvector

我在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();

你能帮助我吗?

1 个答案:

答案 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有效。