下面的代码是Ubuntu标准包中提供的类初始化列表。在这个迭代器和const_iterator中是相同类型的typedef。我只是想知道为什么我们希望为不同类型的迭代器使用相同的typedef?理想情况下,对于Iterator,它应该有typedef _E * iterator。
// In the class initializer list:
namespace std
{
/// initializer_list
template<class _E>
class initializer_list
{
public:
typedef _E value_type;
typedef const _E& reference;
typedef const _E& const_reference;
typedef size_t size_type;
typedef const _E* iterator;
typedef const _E* const_iterator;
P.S:我无法想到合适的头衔所以我给了这个头衔
答案 0 :(得分:5)
要满足Container的要求,必须存在iterator
和const_iterator
两种类型。许多算法和许多代码都依赖于具有这两种类型的容器。但是,iterator
类型必须是非const
(可变)迭代器。在这种情况下,他们已经确定iterator
和const_iterator
都是const
(不可变的)迭代器。
他们将迭代器都设为const
的原因是因为他们显然不希望您能够更改initializer_list
中的值。
作为另一个示例,请查看其iterator
和const_iterator
类型也是常量迭代器的std::set
。由于std::set
包含有序元素,因此如果您能够更改std::set
的内容,则该顺序将无效。为了防止这种情况,两个迭代器类型都是不可变的。
答案 1 :(得分:2)
因为满足Container
要求的任何类型都需要这些字段。就是这样的情况恰好发生了
std::initializer_list
,iterator
和const_iterator
相同。
答案 2 :(得分:0)
这可能是因为您不想更改存储在初始化列表中的值。它们意味着要被传递给构造函数的临时对象。
C ++有一个(非正式的,现在)理想的概念,适用于泛型类型。 Container概念要求某些typedef可用于您的对象。由于std :: initializer_list是一个容器,因此它需要:: iterator和:: const_iterator typedef。但是,像std :: set一样,你不想让用户修改initializer_list中的元素,因此:: iterator与:: const_iterator相同:它们都是只读的。