Другие уже опубликовали множество решений, показывающих, как проводить лексические сравнения с const char*
, поэтому я не буду беспокоиться.
Пожалуйста, не предлагайте создавать std :: strings - это пустая трата времени и пространства.
Если std::string
является пустой тратой времени и пространства, то std::set
может быть пустой тратой времени и пространства. Каждый элемент в std::set
размещается отдельно от бесплатного магазина. В зависимости от того, как ваша программа использует наборы, это может ухудшить производительность, чем производительность поиска в std::set
O (log n). Вы можете получить лучшие результаты, используя другую структуру данных, такую как отсортированный std::vector
, или статически распределенный массив, который сортируется во время компиляции, в зависимости от предполагаемого времени жизни набора.
стандартная библиотека C ++ предлагает std :: less, но ее реализация основана на непосредственном сравнении двух ключей, что не является стандартным для указателей.
Строки являются статическими, поэтому их можно сравнивать на (in) равенство по их адресу.
Это зависит от того, на что указывают указатели. Если все ключи выделены из одного и того же массива, то использование operator<
для сравнения указателей не является неопределенным поведением.
Пример массива, содержащего отдельные статические строки:
static const char keys[] = "apple\0banana\0cantaloupe";
Если вы создадите std::set<const char*>
и заполните его указателями, которые указывают на этот массив, их порядок будет четко определен.
Если, однако, все строки являются отдельными строковыми литералами, сравнение их адресов, скорее всего, приведет к неопределенному поведению. Работает ли он или нет, зависит от реализации компилятора / компоновщика, от того, как вы его используете, и от ваших ожиданий.
Если ваш компилятор / компоновщик поддерживает объединение строк и он включен, дублирующиеся строковые литералы должны иметь один и тот же адрес, но гарантированно ли они есть во всех случаях? Безопасно ли полагаться на оптимизацию компоновщика для корректной работы?
Если вы используете строковые литералы только в одной единице перевода, установленный порядок может основываться на порядке, в котором строки используются впервые, но если вы измените другую единицу перевода, чтобы использовать одну из тех же строковые литералы, установленный порядок может измениться.
Я знаю, что могу определить свой собственный функтор и реализовать оператор (), приведя указатели к целым числам и сравнив их
Преобразование указателей в uintptr_t
, по-видимому, не принесет пользы по сравнению с использованием сравнения указателей. Результат одинаков в любом случае: зависит от реализации.