const_iterator <T>和iterator <const T>有什么区别?

时间:2019-06-17 01:19:03

标签: c++ iterator const const-iterator

假设我正在实现一个集合,比如说std::vector。我需要实现iteratorconst_iterator,但是一旦完成iterator就可以const_iterator了,而不仅仅是实现为iterator<const T>(其中T集合中包含的类型是什么?

之所以不起作用,一定有原因,因为在实现iteratorconst_iterator的过程中有上百万个关于如何重用代码的问题,但没有一个说“只使用{{ 1}}作为类型。

1 个答案:

答案 0 :(得分:4)

std::iterator_traits<Iter>::value_type对于T应该是const_iterator<T>,但是对于const Titerator<const T> 1 。如果将iterator<const T>用作const_iterator<T>,则必须违反这些假设之一。

只要值类型的常量性与迭代器的常量性是一个单独的模板参数,就应该可以对两个迭代器使用一个通用模板。像这样:

template<class T>
struct container
{
    template<class ItPtr>
    struct iterator_common
    {
        using value_type = T;
        using pointer = ItPtr;
        using reference = std::remove_pointer_t<ItPtr>&;
        // ...
    };

    using iterator = iterator_common<T*>;
    using const_iterator = iterator_common<const T*>;
    // ...
};

1 直到C ++ 20,在其中它应该是std::remove_cv_t<const T>,即T。因此,在将来的标准版本中,这对您的建议不会有问题。