处理超出范围的指数

时间:2011-03-17 14:09:03

标签: c++ oop exception-handling

对于容器类,当类的用户尝试设置超出类大小的值时,预期的行为应该是什么?

有问题的方法是“替换”方法(如operator[]),而不是“添加”方法(如operator+=)。

我可以抛出out_of_range异常,或者我可以调整容器大小以适应添加。

4 个答案:

答案 0 :(得分:4)

超出范围的异常在这里更合适,因为“替换”语义通常意味着调用者假定/断言在指定的索引处存在数据,而没有。

答案 1 :(得分:3)

对于std::vector::operator[],域错误会导致未定义的行为。对于std::map::operator[],域错误会创建一个新条目。我想设计问题是:

  • 扩展容器有多贵?也就是说,您可以只创建一个项目(例如map::operator[]),还是必须创建所有介入项目(例如vector::operator[]

  • 与访问功能相比,范围检查的费用是多少?在map中,一旦运行了访问功能,范围检查就是免费的。在vector范围内,检查大约会使访问费用增加一倍。

由于您正在设计容器,因此请随意使用适合您和您的客户的任何模式。请务必记录行为。

答案 2 :(得分:1)

一般来说,我更喜欢抛出超出范围的异常。如果用户确实想要扩展存储,请为他们提供一种方法。这将消除许多无意的扩展,这可能导致更严重的错误。这只是我的意见。

答案 3 :(得分:1)

尚未提及的一点是,提供特殊的一对一案例以扩展班级规模有时可能是有用的。这个想法是一个类可能有一个不变的项目[0]到项目[length-1]都已被有效地分配。如果有人试图写入项目[K],K> =长度+ 1,则可能需要创建具有未知值的新项[length..K-1],从而打破类不变量。另一方面,如果一个人写入项目[length],可以将长度增加一个并保持类不变。

相关问题