gpt4 book ai didi

c++ - STL 中 "end"指针非常量的基本原理

转载 作者:行者123 更新时间:2023-11-30 03:58:03 24 4
gpt4 key购买 nike

为什么STL函数的原型(prototype)是这样的

template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);

不是

template <class RandomAccessIterator,ConstRandomAccessIterator>
void sort (RandomAccessIterator first, ConstRandomAccessIterator last);

我们绝不能写入由last 表示的元素。然而,对于一个非常简单的数组类,该库需要函数将结束迭代器作为非 const 返回:

T* Container::end()
{
return begin+N; //I will screw up the heap if I ever wrote to the address returned here!
}

而不是形式上正确的

const T* Container::end() const
{
return begin+N;
}

最佳答案

STL 对范围的开始和结束使用一种迭代器类型的主要原因似乎主要是创建者(主要是 Alexander Stepanov)的设计偏好。第二个原因是 STL 的启动方式足够复杂,无需处理不同的开始和结束迭代器。

从那以后,我们学到了很多关于算法使用的知识,可能值得重新考虑开始和结束迭代器是否应该始终使用相同的类型,尽管可能不是因为你引用的原因:使结束迭代器引用一个常量对象并不这真的很有帮助,因为你既不能读也不能写。此外,对于双向迭代器,将结束设置为只读是积极的敌意,因为有必要使用开始迭代器遍历序列以构建可写结束迭代器(对于随机访问迭代器,您可以在恒定时间内获得结束迭代器从开始迭代器开始,也就是说,这不是什么大问题)。

请注意,仅对结束迭代器使用不同的推导类型实际上创造了巨大的灵 active ,这比创建迭代器的只读版本要多得多。要将 constness 添加到 begin 的迭代器类型中,您宁愿使用类似

的东西
template <typename RndIt>
void sort(RndIt begin, typename iterator_traits<RndIt>::const_iterator);

当然,这现在行不通,并且如上所述,这将是一个坏主意:您肯定希望能够使用两个迭代器来写入算法,尽管您显然不会写通结束迭代器。

使末尾迭代器成为不同类型的原因是对于输入迭代器和前向迭代器,末尾实际上是不可移动的:如果不超出算法已知的末尾就不能向前移动它,而且没有办法移动它落后了。因此,它实际上只是一个端点,而不是一个迭代器。给端点一个不同的类型可以使算法的使用更有效,新迭代器的创建更简单。有关此推理的更多详细信息,请参阅 Eric Niebler's blogs关于这个话题。

关于c++ - STL 中 "end"指针非常量的基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27650664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com