对于容器类,当类的用户试图设置超出类的大小的值时,预期的行为应该是什么?处理超出范围的索引
有问题的方法是“替换”方法(如operator[]
),而不是“添加”方法(如operator+=
)。
我可以抛出out_of_range
异常,或者我可以调整容器的大小以适应添加。
对于容器类,当类的用户试图设置超出类的大小的值时,预期的行为应该是什么?处理超出范围的索引
有问题的方法是“替换”方法(如operator[]
),而不是“添加”方法(如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],从而破坏类不变量。另一方面,如果写入项目[length],则可以将长度增加1并保持类不变。
+1:我知道我们在这里讨论的是C++,但是*显式优于隐式*仍然适用。 – 2011-03-17 14:14:56