【问题标题】:Why does std::map::erase return int rather than bool?为什么 std::map::erase 返回 int 而不是 bool?
【发布时间】:2021-10-09 19:07:13
【问题描述】:

我想知道为什么std::map::erase 有一个重载,它返回一个int,它代表被删除的元素数量;所以只要元素是唯一的,那么数字就是10。在这种情况下,为什么它不返回 bool 而不是 int

     std::map<std::string, std::size_t> containers{
    {"map", 1}, {"set", 10}, {"map", 5}, {"vector", 4}, {"array", 7}
};

for(auto const& p : containers)
    std::cout << p.first << " " << p.second << '\n';

std::cout << containers.erase("map") << '\n'; // 1
std::cout << containers.erase("map") << '\n'; // 0

for(auto const& p : containers)
    std::cout << p.first << " " << p.second << '\n';

【问题讨论】:

  • 这可能是为了与std::multimap保持一致,erase 方法一次可以删除多个元素。

标签: c++ c++11 stdmap


【解决方案1】:

一旦您考虑了std::multimap::erase() 返回的内容,您的问题的答案就会变得显而易见。

该容器的 erase() 方法可能返回 0,也可能返回 1,或者可能返回其他值。

拥有一个跨容器一致的接口允许实现与任一容器同样有效的模板和算法,因为来自erase() 的返回值,无论是来自map 还是来自multimap,都意味着同样的事情。

附:无需查找,您应该可以很好地猜测 std::setstd::multiseterase() 方法返回什么。

【讨论】:

  • 所以他们也返回int,不是吗?
  • 不,他们返回size_type
  • @user1095108:是的,我是认真的。无论如何,一个整数类型,报告已擦除元素的数量。
【解决方案2】:

所有的 c++ 有序关联容器都基于二叉搜索树,是相关的,这反映在它们相似的接口中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2014-09-17
    • 2020-12-13
    相关资源
    最近更新 更多