2011-03-17 143 views
2

对于容器类,当类的用户试图设置超出类的大小的值时,预期的行为应该是什么?处理超出范围的索引

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

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

回答

4

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

+2

+1:我知道我们在这里讨论的是C++,但是*显式优于隐式*仍然适用。 – 2011-03-17 14:14:56

1

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

3

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

  • 扩展容器的代价是多大?也就是说,你只能创建一个项目(如map::operator[]),或者你必须创建所有干预项目(如vector::operator[]

  • 有多贵范围检查,相较于接入功能?在map中,一旦您运行访问功能,范围检查就会自由。在vector范围检查大约加倍访问的成本。

由于您正在设计集装箱,随时可以强加适合您和您的客户的任何模式。只要确保记录行为。

1

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