【问题标题】:public: typedef other_class::const_iterator my_class::const_iterator - acceptable?public: typedef other_class::const_iterator my_class::const_iterator - 可以接受吗?
【发布时间】:2011-11-13 03:28:05
【问题描述】:

我正在寻找一种将 std::set::const_iterator 用作我自己类的 const_iterator 的方法。

我的代码(实际上表现正确且编译良好),如下所示:

class MyClass{

public:
    typedef std::set<T>::const_iterator const_iterator;

const_iterator begin() const {
    return mySet->begin();
}

const_iterator end() const {
    return mySet->end();
}

}; // MyClass

所以,我的问题是:我使用 const_iterator 的方式是否可以接受并且也是 STL 预期的形式?

编辑:相关问题和答案How to typedef the iterator of a nested container?

【问题讨论】:

  • 什么是T?我猜你已经模板化了MyClass?,在这种情况下我想你会想要一个typedef typename std::set&lt;T&gt;...?但除此之外对我来说看起来不错......
  • 不,我的课程没有模板化。我在那里有点不精确。实际上 T 的类型是 unsigned int。
  • 好吧,我觉得那没问题。我似乎记得 Bjarne Stroustrup 在他的书 The c++ programming language 中做同样的事情(我没有它可以参考它 - 这就是为什么这不是一个答案)但我认为你做对了。
  • 啊...那太酷了 :) 你还记得 Staustroups 书的名字吗?

标签: c++ stl typedef


【解决方案1】:

拥有内部类型的想法是,通用代码可以在无需事先了解实现的情况下使用您的类。要点是有一个const_iterator,并且它具有常量迭代器的语义。您从内部类型借用迭代器这一事实只是调用代码不应该关心的实现细节。

也就是说,问题不在于定义 const_iterator 内部类型,因为这会增加用户代码中的耦合,他们必须显式使用 std::set&lt;T&gt;::const_iterator,而这反过来又使成员部分的类型接口(即你不能在不破坏用户代码的情况下更改成员的实现)。

【讨论】:

    【解决方案2】:

    查看其他 C++ 标准库容器适配器,例如 std::queuestd::queue 只是底层容器顶部的适配器(默认为 std::deque)。

    这正是那些适配器中使用的方法。鉴于此,我会说你的实现很好。

    【讨论】:

    • 谢谢。给出这个解释,我很高兴:)
    【解决方案3】:

    是的,当然。您可以将std::set&lt;T&gt;::const_iterator 存储在您喜欢的任何位置,并且为该类型设置别名就更好了。

    【讨论】:

      【解决方案4】:

      它不是特别封装,而是一种完全有效的技术。

      【讨论】:

        猜你喜欢
        • 2012-09-30
        • 2011-02-20
        • 2021-02-20
        • 1970-01-01
        • 2012-11-29
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        相关资源
        最近更新 更多