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 包装器)