C++ 中的对是否有 NULL 等价物?
Is there a NULL equivalent for pairs in C++?
如果我在 C++ 中有一个未分配的对,我想使用什么而不是 NULL?
例如,假设我有如下(伪)代码:
pair<int,int> bestPair; //Global variable
updateBestPair(vector<int> a, vector<int> b) {
bestPair = NULL;
for (/* loop through a and b */) {
if (/* pair(a,b) is better than bestPair and better than some baseline */)
bestPair = make_pair(a,b);
}
if (bestPair != NULL) //Found an acceptable best pair
function(bestPair);
else
cout<<"No acceptable pairs found"<<endl;
}
没有。 C++ 对象不能是 "NULLed".
(即使是对象的指针也不能是 "NULLed"!这很令人困惑,因为它们的值可能被设置为空指针值,我们过去有时使用名为 NULL
的宏;然而,这与 "NULLing" 指针本身并不相同。呃,无论如何……)
我推荐 boost::optional
,或者重新考虑拥有一个可以是 "has a useful value" 或 "does not have a useful value" 的全局变量的想法。没有什么用处,它存在还有什么意义?
不,那是不可能的。您可以使用一个附加变量来指示该对的有效性(您有一对)。
Is there a NULL equivalent for pairs in C++?
没有
What would I want to use instead of NULL if I have an unassigned pair in C++?
这里有几个选项:
可以使用指向pair的指针,可以设置为NULL;这可能不是最好的解决方案(因为您显然不需要指针)
你可以用一个boost::optional<std::pair<int,int>>
;
您可以(并且可能 应该)重写您的代码以不使用全局变量。
您可以重组您的控制流以避免在单独的步骤中检查有效对:
pair<int,int> bestPair; //Global variable
updateBestPair(vector<int> a, vector<int> b) {
// not needed
// bestPair = NULL;
//loop through a and b
if (/* pair(a,b) is better than bestPair and ... */)
{
bestPair = make_pair(a,b);
function(bestPair);
}
else
cout<<"No acceptable pairs found"<<endl;
}
你可以选择一个人工值来表示"invalid pair value":
// use as constant, wherever you used NULL before
const auto invalid_pair = std::make_pair(
std::numeric_limits<int>::max(),
std::numeric_limits<int>::max());
你可以使用布尔标志:
pair<int,int> bestPair; //Global variable
updateBestPair(vector<int> a, vector<int> b) {
bool initialized = false;
//loop through a and b
if (/* pair(a,b) is better than bestPair and ... */)
{
bestPair = make_pair(a,b);
initialized = true;
}
if(initialized)
function(bestPair);
else
cout<<"No acceptable pairs found"<<endl;
}
您可以使用自定义解决方案(是否类似于 boost::optional 包装器)
如果我在 C++ 中有一个未分配的对,我想使用什么而不是 NULL?
例如,假设我有如下(伪)代码:
pair<int,int> bestPair; //Global variable
updateBestPair(vector<int> a, vector<int> b) {
bestPair = NULL;
for (/* loop through a and b */) {
if (/* pair(a,b) is better than bestPair and better than some baseline */)
bestPair = make_pair(a,b);
}
if (bestPair != NULL) //Found an acceptable best pair
function(bestPair);
else
cout<<"No acceptable pairs found"<<endl;
}
没有。 C++ 对象不能是 "NULLed".
(即使是对象的指针也不能是 "NULLed"!这很令人困惑,因为它们的值可能被设置为空指针值,我们过去有时使用名为 NULL
的宏;然而,这与 "NULLing" 指针本身并不相同。呃,无论如何……)
我推荐 boost::optional
,或者重新考虑拥有一个可以是 "has a useful value" 或 "does not have a useful value" 的全局变量的想法。没有什么用处,它存在还有什么意义?
不,那是不可能的。您可以使用一个附加变量来指示该对的有效性(您有一对)。
Is there a NULL equivalent for pairs in C++?
没有
What would I want to use instead of NULL if I have an unassigned pair in C++?
这里有几个选项:
可以使用指向pair的指针,可以设置为NULL;这可能不是最好的解决方案(因为您显然不需要指针)
你可以用一个
boost::optional<std::pair<int,int>>
;您可以(并且可能 应该)重写您的代码以不使用全局变量。
您可以重组您的控制流以避免在单独的步骤中检查有效对:
pair<int,int> bestPair; //Global variable updateBestPair(vector<int> a, vector<int> b) { // not needed // bestPair = NULL; //loop through a and b if (/* pair(a,b) is better than bestPair and ... */) { bestPair = make_pair(a,b); function(bestPair); } else cout<<"No acceptable pairs found"<<endl; }
你可以选择一个人工值来表示"invalid pair value":
// use as constant, wherever you used NULL before const auto invalid_pair = std::make_pair( std::numeric_limits<int>::max(), std::numeric_limits<int>::max());
你可以使用布尔标志:
pair<int,int> bestPair; //Global variable updateBestPair(vector<int> a, vector<int> b) { bool initialized = false; //loop through a and b if (/* pair(a,b) is better than bestPair and ... */) { bestPair = make_pair(a,b); initialized = true; } if(initialized) function(bestPair); else cout<<"No acceptable pairs found"<<endl; }
您可以使用自定义解决方案(是否类似于 boost::optional 包装器)