【问题标题】:Why std::erase and std::erase_if don't support projection?为什么 std::erase 和 std::erase_if 不支持投影?
【发布时间】:2021-07-19 15:56:32
【问题描述】:

C++ 范围很好,但 AFAIK 他们仍然“受苦”,因为他们不知道修改容器,例如如果你使用ranges::remove,你仍然需要做container.erase(...

现在有些算法确实知道如何从容器中擦除(std::erasestd::erase_if),但与范围不同,它们不支持投影。

我的问题是,这仅仅是因为(AFAIK)该功能是与范围分开提出的(+ 缺乏时间/缺乏建议),还是有根本原因导致该功能不可用。

【问题讨论】:

  • 远程需要它是否有“根本”原因?使用function adapter
  • 范围后面不一定有容器。
  • @Barry 只是语法糖,对我来说写 &MyStruct::member_ 更好,但这是个人风格的事情......
  • @NoSenseEtAl erase_if(v, proj(&MyStruct::member_, pred))?
  • @Barry 是的,但这不是 std:: 我知道这是一个愚蠢的理由,但是当某些东西在 std 中时,通常将东西卖给其他人要容易得多……但你是对,如果可以使用 Boost,那么 HOF 是不错的选择。

标签: c++ c++20 std-ranges erase-remove-idiom


【解决方案1】:

std::erasestd::erase_if 不是适用于任何容器的算法。它们是对许多容器执行“相同操作”的一组重载函数。

关联容器没有std::erase,因为它要么与它们的成员erase不一致,要么与序列容器erase不一致。

我不认为在 erase_iferase 中存在投影参数存在根本的不兼容,但它们是根据现有的 std::removestd::remove_if 和成员erases 和removes,缺少预测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多