对于容器类,当类的用户尝试设置超出类大小的值时,预期的行为应该是什么?
有问题的方法是“替换”方法(如operator[]
),而不是“添加”方法(如operator+=
)。
我可以抛出out_of_range
异常,或者我可以调整容器大小以适应添加。
答案 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],可以将长度增加一个并保持类不变。