C ++将列表元素指针转换为列表迭代器

时间:2018-06-05 02:38:06

标签: c++ stl containers

我有std::list<T>其中T有一些成员函数,特别是T的构造函数,希望让其他类知道Tlist<T>中的地址。这样其他类可以在以后删除该节点/将其拼接到另一个列表/ etc。

在构造时,T在列表中还没有位置,所以现在它只是给出了自己的地址(通过T::this)。我想知道T*是否可以转换为list<T>::iterator,这将使标准容器操作可用于删除/转移/等。

this question似乎没有立即回答(对于列表)。我想一个解决方法是向list<T>::iterator添加一个新的T字段,并在知道后写入正确的值。然后,可以访问T的类可以访问正确的迭代器。

有趣的是,似乎可以将我自己的列表节点的简单实现推送到T。在这个模型中,T封装了自己的列表功能,因此每个T也是一个列表节点,每个T *都是一个列表迭代器。这可以解决我的问题。 (粗略的草图如下所示,感兴趣。)我没有将它构建成一个完全成熟的容器,因为它似乎是正确实现它的相当多的工作(like here)。所以我想我会使用解决方法,除非社区有任何建议?非常感谢。

/* Base class for T provides list capabilities. Usage T : node<T>. */
template< class T >
struct node
{
    node<T>* next_; /* forward list. */

    /* Here the value is contained *outside* the node: */ 
    T* value() { return static_cast<T*> this; } /* uh-oh */
}

/* The iterator is essentially a convenience wrapper around node<T>*,
   can define operator++() etc. */
template< class T >
struct list<T>::iterator
{
    iterator( node<T>* some_node ) : node_( some_node );
    iterator operator++() { return node_ = node_->next_; }
    /* etc. */
    node<T>* node_;    
}

/* Usage: */
class Example : public node< Example >
{
    /* iterator is directly constructible from node< Example >*, 
       and Example derives from node< Example >, so class can 
       construct its own iterator. */
    operator list< Example >::iterator() { return this; } 

    /* Example's data members here as usual. */
    float data1_;
}

0 个答案:

没有答案