Я всегда считал, что если вы копируете и вставляете код, то есть более элегантное решение. В настоящее время я реализую строковый суффикс trie в C++ и имею две практически идентичные функции, которые отличаются только в своем возвратном выражении.Обобщение булевых функций для более элегантного кода
Первая функция проверяет наличие подстроки, вторая, если она является суффиксом (все строки имеют знак #
, добавленный в конец).
подстрока (строка S)
bool Trie::substring(string S){
Node* currentNode = &nodes[0]; //root
for(unsigned int i = 0; i < S.length(); i++){
int edgeIndex = currentNode->childLoc(S.at(i));
if(edgeIndex == -1)
return false;
else currentNode = currentNode->getEdge(edgeIndex)->getTo();
}
return true;
}
суффикс (строка S)
bool Trie::suffix(string S){
Node* currentNode = &nodes[0]; //root
for(unsigned int i = 0; i < S.length(); i++){
int edgeIndex = currentNode->childLoc(S.at(i));
if(edgeIndex == -1)
return false;
else currentNode = currentNode->getEdge(edgeIndex)->getTo();
}
return (currentNode->childLoc('#') == -1)? false : true; //this will be the index of the terminating character (if it exists), or -1.
}
Как логика быть обобщен более элегантно? Возможно, используя шаблоны?
'возврата (currentNode-> childLoc ('#') == -1)? false: true; 'кажется избыточным, вы можете просто использовать' return currentNode-> childLoc ('#')! = -1; '. То есть, если какой-либо 'childLock' не возвращает перегрузку' operator! = 'Неожиданным образом. –
@ FrançoisAndrieux Спасибо за это :) В любом случае я могу использовать одну общую функцию/шаблон или что-то, чтобы избежать повторения одного и того же кода? –
В этом случае, похоже, вы можете просто перенести аналогичный раздел в другую функцию, и обе функции вызовут новую. Я не могу представить, что решение с участием шаблонов было бы более элегантным, чем определение новой функции для общего блока. –