int指向列表的.end()的指针

时间:2012-02-17 23:42:38

标签: c++ pointers iterator linked-list

我目前正致力于创建一个与标准库类似的头文件。我正在为我的链表实现.end()。在我的cpp文件中,我有一个整数指针,预计会收到.end()的值,如

int* itrend;
itrend = ca.end();

ca只是我头文件中对象的一个​​实例。 在我的hpp文件中,我有一个列表迭代器转到我的listofvalues.end()。我想返回.end()值,如

int* end() 
{
    std::list<value_type>::iterator i = listOfValues.end();
    return (&*i);

}

我的“值列表”只是一个包含多个整数的列表。例如

[1,2,3,4,5,6,7,8,9]

在我的hpp文件中,我有一个列表迭代器转到我的listofvalues.end()。我想返回.end()值(返回列表迭代器);现在这个问题是当我想要一个整数指针时它返回列表迭代器。我试图通过使用&*来尊重它并使用地址,这将导致错误说“List Iterator Not Dereferencable”。我知道这是因为我试图在最后一个值之后获取元素,但这正是我需要返回的,因为我正在尝试重新实现链接列表.end()方法。

有谁知道如何将整数指针指向List.end()

感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

以类似于STL返回begin()的样式实现end()iterator,而不是指针:

template <typename value_type>
class my_list
{
public:
    typedef std::list<value_type>::iterator iterator;
    typedef std::list<value_type>::const_iterator const_iterator;

    iterator begin() { return listofValues.begin(); }
    const_iterator begin() const { return listofValues.begin(); }


    iterator end() { return listofValues.end(); }
    const_iterator end() const { return listofValues.end(); }
};

答案 1 :(得分:2)

你做不到。这就是为什么标准库容器比平面阵列更通用的原因。在C风格的数组中,您可以在结尾处形成指针(尽管您不允许取消引用它)并将其用作哨兵。在一个更抽象的容器中,没有这样的“自然”机制,这就是为什么迭代器首先被发明的原因:它们是在更一般的环境中工作的指针的泛化。每个容器的迭代器类型必须解决以自己的方式提供合适的“结束”标记值的问题。

答案 2 :(得分:2)

你如何使用你自己的end()的insmentaton?当迭代器返回end()时为什么不返回null?

int* end() 
{
    return NULL;
}

答案 3 :(得分:0)

用指针表示链接列表末尾的想法有些缺陷,因为你不能在链表中用++进行指针,它不会迭代任何东西。

如果您想获得列表工具l.back()的背面并返回对最后一个值的引用。