Существует ли нулевой эквивалент для пар в 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 ответа:
Существует ли нулевой эквивалент для пар в 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
, либо переосмыслить идею наличия глобальной переменной, которая может быть "имеет полезное значение" или "не имеет полезного значения". Какой смысл в его существовании, если он не имеет никакой полезной ценности?