我正在写(作为一个自学练习)一个简单的STL-Like范围.它是一个不可变随机访问"容器".我的范围只保留其起始元素,元素数量和步长(两个连续元素之间的差异):
struct range
{
...
private:
value_type m_first_element, m_element_count, m_step;
};
Run Code Online (Sandbox Code Playgroud)
因为我的范围不包含元素,所以它使用以下方法计算所需的元素:
// In the standards, the operator[]
// should return a const reference.
// Because Range doesn't store its elements
// internally, we return a copy of the value.
value_type operator[](size_type index)
{
return m_first_element + m_step*index;
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我并没有const reference像标准所说的那样回归.现在,我可以假设const reference在使用标准库中的非变异算法方面,元素的副本和副本是相同的吗?
任何有关该主题的建议都非常感谢.
@Steve Jessop:你提到迭代器很好.
实际上,我使用sgi作为参考.在该页面的末尾,它说:
假设x和y是来自相同范围的迭代器:
不变量身份
x == y if and only if &*x == &*y
所以,它归结为我实际问过的同一个原始问题:)
标准算法并不真正使用operator[],它们都是根据迭代器定义的,除非我忘记了一些重要的东西。是否计划在您的“范围”之上重新实现标准算法operator[],而不是迭代器?
在非变异算法确实使用迭代器的情况下,它们都是根据*it可分配给需要分配给的任何内容来定义的,或者以其他方式对某些指定的操作或函数调用有效。我认为所有或大多数此类操作都具有价值。
我能想到的一件事是,您不能在需要非常量引用的地方传递值。是否有需要非常量引用的非变异算法?可能不会,只要任何函子参数等都足够const。
很抱歉,我不能肯定地说没有任何奇怪的角落出错,但对我来说听起来基本上没问题。即使存在任何问题,您也可以通过算法版本与标准算法版本之间的要求非常细微的差异来解决它们。
编辑:第二个可能出错的事情是获取指针/引用并将它们保留得太长。据我所知,标准算法不保留对元素的指针或引用 - 原因是它的容器保证了元素指针的有效性,迭代器类型仅告诉您迭代器何时保持有效(例如当原始迭代器递增时,输入迭代器的副本不一定保持有效,而对于多遍算法,可以以这种方式复制前向迭代器)。由于算法看不到容器,只看到迭代器,因此我认为它们没有理由假设元素是持久的。
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |