【发布时间】:2010-01-31 09:08:03
【问题描述】:
我正在编写(作为自学练习)一个简单的类似 STL 的范围。它是一个不可变随机访问的“容器”。我的范围,只保留它的起始元素,元素的数量和步长(两个连续元素之间的差异):
struct range
{
...
private:
value_type m_first_element, m_element_count, m_step;
};
因为我的范围不包含元素,所以它使用以下方法计算所需的元素:
// 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;
}
如您所见,我没有像标准所说的那样返回const reference。现在,我可以假设 const reference 和元素的副本在使用标准库中的非变异算法方面是相同的吗?
非常感谢任何有关该主题的建议。
@Steve Jessop:你提到了迭代器。
其实我用的是sgi as my reference。在该页面的末尾,它说:
假设 x 和 y 是同一范围内的迭代器:
不变量身份
x == y if and only if &*x == &*y
所以,它归结为我实际上问过的同一个原始问题:)
【问题讨论】:
-
如果您在 operator[] 中创建了一个要返回的元素,然后返回了一个对它的引用,那么该引用是否总是一个错误的引用,因为该实例会立即超出范围?
该标准讨论了 CONTAINERS 中的引用,这不是容器。 -
@Chris 我同意它不是一个真正的容器。这就是为什么我在上面的第二句话中将“容器”放在双引号之间。
-
您可能需要查看 boost::iterator_range 和 boost::sub_range 以获得灵感:boost.org/doc/libs/1_41_0/libs/range/index.html
-
您可以同时拥有“范围”对象和迭代器。我也认为您过于担心:如果您的迭代器不具有这种恒等式,那就这样吧。如果按值返回,那么无论如何都可能取不到结果的地址。