Я согласен с ответом от zacherates.
Но вы можете сделать вызов intern () в ваших нелиберальных строках.
Из примера zacherates:
// ... but they are not the same object
new String("test") == "test" ==> false
Если вы ставите нелитеральное равенство строки, это правда
new String("test").intern() == "test" ==> true
Добавляя к предыдущему ответу, я просто хотел очистить предполагаемую путаницу с указателем на функцию и функцией.
void heapify(S bt[], unsigned els, bool(*shouldBeBefore)(const S & a, const S & b));
int main() {
[...]
heapify(x, 9, shouldBeBefore(test[0], test[1]));
[...]
}
bool shouldBeBefore(const S & a, const S & b) {
return a.x < b.x;
}
shouldBeBefore
называет функцию, а также аргумент функции. Это добавляет некоторую путаницу. heapify
фактически разрешено принимать любую функцию с сигнатурой bool(const S&, const S&)
, и название должно указывать на это.
Для указателей на функции всегда удобно добавить определение типа
using Comparator = bool(*)(const S&, const S&);
// typedef bool(*Comparator)(const S&, const S&); // or by typedef
Код будет выглядеть как
void heapify(S bt[], unsigned els, Comparator comparator);
int main() {
[...]
heapify(x, 9, shouldBeBefore(test[0], test[1]));
[...]
}
bool shouldBeBefore(const S & a, const S & b) {
return a.x < b.x;
}
, и вы будете вызывать компаратор, как если бы любая другая функция.
Определение указателя на функцию является многословным. Вы также можете использовать std :: function, что немного упрощает синтаксис
using Comparator = std::function<bool(const S&, const S&>>;
Преимущество состоит в том, что вы можете вызывать heapify с любым вызываемым.
Переместите ваше объявление (или полное определение) из shouldBeBefore
выше main
, где вы вызываете heapify
. Но когда вы вызываете heapify
, вы просто передаете имя функции. heapify
вызовет вашу функцию shouldBeBefore
со своими собственными параметрами.
void heapify(S bt[], unsigned els, bool(*shouldBeBefore)(const S & a, const S & b));
bool shouldBeBefore(const S & a, const S & b);
int main()
{
S test[9] = { {1.1,1,'A'},{1.3,2,'B'},{1.8,3,'C'},{1.7,4,'D'},{5.1,5,'E'},
{4.3,6,'F'},{3.8,7,'G'},{4.7,8,'H'},{2.7,9,'I'} };
unsigned int length = sizeof(test)/sizeof(test[0]); // 9
heapify(S, length, shouldBeBefore);
return 0;
}
bool shouldBeBefore(const S & a, const S & b)
{
return (a.x < b.x);
}
В вашей реализации heapify
вы можете вызывать shouldBeBefore
, как и любую другую функцию:
void heapify(S bt[], unsigned els, bool(*shouldBeBefore)(const S & a, const S & b))
{
...
if (shouldBeBefore(S[i+1], S[i]) {
...
}
...
}