【问题标题】:Encapsulate std::map to allow iterating, but no direct key access? [duplicate]封装 std::map 以允许迭代,但不能直接访问密钥? [复制]
【发布时间】:2019-01-22 12:49:28
【问题描述】:

有没有办法将std::map 封装在用户定义的类中,允许迭代,但不允许直接访问密钥?

我想在插入时操作密钥,并且我想通过用户定义的方法强制所有对元素的访问(因为密钥需要修改)。

我认为问题在于允许在地图上进行迭代,同时阻止用户通过迭代器访问密钥。

【问题讨论】:

  • 包装迭代器?
  • 您可以创建自己的迭代器来覆盖实际的地图迭代器,但只取消对值的引用。 Boost 为此提供了转换迭代器,但编写自己的迭代器很简单。
  • 如果您在插入时操作键,如果键(在迭代时)不是他们期望的值,地图的用户如何知道他们获得了特定元素?
  • 暴露转换后的键有什么问题?

标签: c++ dictionary stl encapsulation


【解决方案1】:

不要暴露迭代器。公开一个 for_each 函数,将每个元素传递给用户提供的 (lambda) 函数。

或者,使用transform iterator

【讨论】:

  • 听起来效率极低,灵活性也较差。除非编译器能以某种方式优化掉 lambda 表达式。
  • @riv 我看不出效率低下的原因——编译器可以内联。尝试在启用优化的情况下编译您的代码。
  • Lambdas 不是免费的,尤其是当包装在std::function 中时,并且是调试的噩梦(尽管较新的 VS 版本可以跳过 STL 代码)。迭代器要好得多,并且可以让您使用基于范围的 for。
  • @riv 您将两件事混为一谈。是的,当std::function 包装一个 lambda 时,间接调用是有代价的。但是,答案中没有建议这样做。而且,当 lambdas 作为模板化回调传递时,它们实际上是高度可内联的,并且尽可能接近“免费”。另一方面,显然,有时显式循环比 for_each 调用更具表现力。
  • 你说得对,它们的性能似乎与迭代器版本相同,但表现力点仍然存在。
猜你喜欢
  • 2014-01-31
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2020-06-06
  • 2014-01-22
  • 2012-12-27
  • 2019-02-01
  • 1970-01-01
相关资源
最近更新 更多