[英]Handling Out-of-Range Indices
对于容器类,当类的用户尝试设置超出类大小的值时,预期的行为应该是什么?
有问题的方法是“替换”方法(如operator[]
),而不是“add”方法(如operator+=
)。
我可以抛出一个out_of_range
异常,或者我可以调整容器大小以适应添加。
超出范围的异常在这里更合适,因为“替换”语义通常意味着调用者假定/断言在指定的索引处存在数据,而没有。
对于std::vector::operator[]
,域错误会导致未定义的行为。 对于std::map::operator[]
,域错误会创建一个新条目。 我想设计问题是:
扩展容器有多贵? 也就是说,你可以只创建一个项目(比如map::operator[]
),或者你是否必须创建所有介入的项目(如vector::operator[]
)
与访问功能相比,范围检查有多贵? 在map
,一旦运行了访问功能,范围检查就是免费的。 在vector
,范围检查大约使访问成本增加一倍。
由于您正在设计容器,因此请随意使用适合您和您的客户的任何模式。 请务必记录行为。
一般来说,我更喜欢抛出超出范围的异常。 如果用户确实想要扩展存储,请为他们提供一种方法。 这将消除许多无意的扩展,这可能导致更严重的错误。 这只是我的看法。
尚未提及的一点是,提供特殊的一对一案例以扩展班级规模有时可能是有用的。 这个想法是一个类可能有一个不变的项目[0]到项目[length-1]都已被有效地分配。 如果有人试图写入项目[K],K> = length + 1,则可能需要创建具有未知值的新项[length..K-1],从而打破类不变量。 另一方面,如果一个人写入item [length],则可以将长度增加一个并保持类不变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.