【问题标题】:More elegant way to return index of a list返回列表索引的更优雅的方式
【发布时间】:2013-08-25 02:17:49
【问题描述】:

我正在用 C++ 编写一个循环列表。这是我的代码

class CList
{
private:
    class ListNode
    {
    public:
        int v;
        ListNode *prev;
        ListNode *next;
        /*constructor*/
    };
    ListNode *_tail;
public:
    typedef const void* const Index;//need a way to represent something like 'index' or 'position'
    CList():_tail(0)
    {

    }
    void print()const;
    void insert(Index pos, const int &value);
    Index find(/*some condition*/);
};

嵌套类ListNode只是用于实现,所以我不希望CList的用户可以访问ListNode。但是由于它是一个列表,用户可以在某个位置插入新节点,所以我添加了成员​​Index(索引不应该被修改!)。但这很愚蠢,我必须手动将其转换为ListNode*。有没有一种优雅的方式来做到这一点?或者使用嵌套类只是乞讨时的错误。

【问题讨论】:

  • 我不确定这是否有意义。如果我为您提供一个“索引”,它实际上是一个指向ListNode 的指针,我已经可以访问它了。我可以随意维护指针并对其进行变异。将其隐藏在 void* 后面不会改变任何事情。您应该简单地拥有一个 Insert(const T& value) 并在内部自己创建节点。然后您可以拥有T Find(const T& value)。当然,您可以使用 std::list 并完成它。
  • 但是用户看不到嵌套的私有类ListNode,你不能把它转换成ListNode*

标签: c++ nested-class


【解决方案1】:

处理容器中位置的规范 C++ 方法当然是使用迭代器。迭代器可以在内部保存指向您的ListNode 的指针,并使用取消引用operator*()operator->() 来提供对给定位置元素的访问。两个迭代器可以比较以确定它们是否指向相同的位置(即,指向相同的内部ListNode)。除了find() 操作之外,insert() 操作还可以提供一个迭代器。 ...当然,erase() 成员可以使用迭代器来删除元素。

要完全支持 find(),您还需要某种指示符,例如,指向 null 而不是 ListNode 的单数迭代器,以指示未找到该元素。

【讨论】:

  • 是的,我已经考虑过迭代器。在这个简单的实现中做起来太繁重了。我得再考虑一下。也许iterator 正是我必须去的。
猜你喜欢
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多