【问题标题】:How do you iterate through a C++ map?你如何遍历 C++ 映射?
【发布时间】:2016-07-22 20:33:18
【问题描述】:

例如:

map<string, Person*> family;
family["Bill"] = new Person();
family["Jill"] = new Person();

...

// vvv does not work vvv
for (Person* person: family)
    delete person;

我正在尝试通过映射执行 for-each 循环,以释放所有指针的内存。这适用于矢量,但不适用于地图。我怎样才能做到这一点?

【问题讨论】:

  • 如果你在任何搜索引擎中输入你的标题,你会发现很多方法
  • 您查看std::mapvalue_type 是什么,然后使用auto。你就是这样做的。
  • 为什么不让地图保存智能指针而不是原始指针?那么仅仅清除地图就会导致智能指针释放它们的资源。
  • 使用智能指针或按值存储Person,内存会自动为你释放。
  • 大家想说什么,don't use pointers

标签: c++ dictionary stl


【解决方案1】:
for( auto const& pair : family )
{
    cout << pair.first << " represented by object at " << (void*)pair.second << "\n";
}

与其使用循环删除对象,不如考虑直接存储对象而不是指向动态分配对象的指针。

这是删除所有 Person 对象并删除其映射条目的一种方法:

while( not family.empty() )
{
    auto const it = family.begin();
    delete it->first;
    family.erase( it );
}

如果您存储 Person 对象(而不是指向动态分配对象的指针),这将减少到

family.clear();

【讨论】:

  • 一个简单的delete pair.second; 就足够了吗?
  • @CoffeeMaker:只要以后永远不会引用该指针,甚至不会复制该指针。确保这一点的一种方法是删除该映射条目。但是你不能在基于范围的循环遍历所有成员时轻松做到这一点。
  • @CoffeeMaker:我用更多信息更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2011-05-11
  • 2011-04-29
  • 2012-05-14
  • 2017-03-19
相关资源
最近更新 更多