gpt4 book ai didi

c++随机列表元素不被循环删除

转载 作者:行者123 更新时间:2023-11-30 04:01:26 24 4
gpt4 key购买 nike

我有一个函数,当元素的数量超过 250 时,它会从一个名为 bunnies 的 map (该 map 包含类对象)和一个名为 names 的列表(该列表包含 map 的键)中随机删除元素。但是,随机 map 元素将被删除但列表条目不会(我认为这是正在发生的事情,尽管 map 元素的一部分显然存在)。结果是,当我使用代码的第二部分遍历列表并显示与这些键关联的映射值时,我得到了很大的负值,如底部的示例。

很明显列表元素没有被删除,但为什么呢?

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";
}

我使用这段代码打印出 map 值。

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

最佳答案

问题似乎是这样的:

 std::advance(it, number);

这应该是 position , 不是 number .

另一个问题是 map存储唯一名称。如果有不止一只同名的 Bunny 怎么办?例如,如果 list有 3 个兔子名字“John”, map 将只能容纳一个“John”,因为 map 中的键必须是唯一的。

要么使用 multimap如果名称可以重复,或者使用 std::set而不是 std::list如果兔子必须有唯一的名字。

也许总的来说,你可以使用 std::map<std::string, Bunny> ,忘记 std::list . map 本身包含您需要的所有信息。除非我遗漏了什么,否则我认为不需要 std::list做多余的工作。

关于c++随机列表元素不被循环删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25775740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com