pair<int, int> findEmpty(int bo[9][9], int n){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(bo[i][j]==0){
return (make_pair(i, j));
}
}
}
//return NULL;
}
如果不能返回NULL,有什么替代方法?
使用选项
类型表示可能不存在的状态。
如果您使用的是C++17,则可以使用std::optional<;t>
,如果您使用Boost,则可以使用Boost::optional<;t>
等。您甚至可以实现自己版本的optional
。 关键是要使用一个语义类型来指示可能存在值,也可能不存在值。
使用C++17中的std::optional
,您的代码将变为:
optional<pair<int, int>> findEmpty(int bo[9][9], int n){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(bo[i][j]==0){
return make_pair(i, j);
}
}
}
return nullopt;
}
虽然您可以通过返回一对(-1,-1)
等类似sentinel的值来解决这个问题,但这不是推荐的做法。 这将强制检查调用方上的特定哨兵值,这些哨兵值很容易被遗漏或遗忘--并可能导致错误的哨兵值进入其他算术或间接方向,而这些算术或间接方向可能永远不会期望负值。
使用语义类型来传达可为空性有助于防止这类错误。