【发布时间】:2014-09-10 21:56:57
【问题描述】:
我有一个函数,当元素数量超过 250 时,它会从名为 bunnies 的映射(该映射包含类对象)和一个称为名称的列表(该列表包含映射的键)中随机删除元素。但是,随机地图元素将被删除,但列表条目不会(我认为这是正在发生的事情,尽管地图元素的一部分显然仍然存在)。结果是,当我使用第二段代码遍历列表并显示与这些键关联的映射值时,我得到了像底部示例一样的大负值。
显然列表元素没有被删除,但为什么呢?
void cull(std::map<std::string, Bunny> &bunnies, std::list<std::string> &names,int n)
{
int number = n, position = 0;
for (number = n; number > 125; number--)
{
position = rand() % names.size();
std::list<std::string>::iterator it = names.begin();
std::advance(it, position);
bunnies.erase(*it);
names.erase(it);
it = names.begin();
}
std::cout << "\n" << n - 125 << "rabbits culled";
}
我使用此代码打印出地图值。
for (std::list<std::string>::iterator it = names.begin(); it != names.end(); it++)
{
n++;
std::cout << n << "\t" << " " << *it << "\t" << bunnies[*it].a() << "\t" << bunnies[*it].s() << "\t" << bunnies[*it].c() << "\t" << bunnies[*it].st() << "\n";
这是输出。顶部是它应该显示的内容,底部是程序失败时发生的情况。
165 Tom_n 14 1 0 1
166 Lin_c -842150451 -842150451 -842150451 -842150451
【问题讨论】:
-
一个问题:你为什么要这样做?
bunnies[*it].~Bunny(); -
@PaulMcKenzie 抱歉,这不应该存在并且不会影响问题(无论有没有它都会发生)。
-
永远不要直接调用析构函数!它应该被自动调用。应用程序不会崩溃真是个奇迹。
-
@jeffpkamp 为什么是幻数
125? -
std::advance(it, number)应改为std::advance(it, position)。