Существует ли нулевой эквивалент для пар в C++?


Что бы я хотел использовать вместо NULL, если бы у меня была неназначенная пара в C++?

В качестве примера предположим, что у меня есть (псевдо)код, подобный следующему:

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;
}
3 3

3 ответа:

Существует ли нулевой эквивалент для пар в C++?

Нет.

Что бы я хотел использовать вместо NULL, если бы у меня была неназначенная пара в C++?

Вот несколько вариантов:

  • Вы можете использовать указатель на пару, который может быть установлен в NULL; это, вероятно, не лучшее решение (так как вам явно не требуется указатель)

  • Вы можете использовать a 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;
    }
    
  • Вы можете выбрать искусственное значение для представления "недопустимого значения пары":

    // 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 wrapper или нет)

Нет. Объекты C++ не могут быть "обнулены".

(даже указатели, которые являются объектами, не могут быть "обнулены"! Это сбивает с толку, потому что их значение может быть установлено в нулевое значение указателя, которое мы иногда в прошлом получали с помощью макроса с именем NULL; однако это никогда не было равнозначно "обнулению" самого указателя. Э, в любом случае...)

Я рекомендую либо boost::optional, либо переосмыслить идею наличия глобальной переменной, которая может быть "имеет полезное значение" или "не имеет полезного значения". Какой смысл в его существовании, если он не имеет никакой полезной ценности?

Нет, это невозможно. Вы можете использовать дополнительную переменную, чтобы указать действительность пары (что у вас есть пара).