繁体   English   中英

处理超出范围的指数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM