Обычно двоичное дерево (std::map
, которое вы в настоящее время используете) обеспечивает адекватную производительность. Ваш бюджет процессора должен быть очень маленьким.
Бинарный поиск, вероятно, не будет намного быстрее. Хеш-таблица (std::unordered_map
) может быть решением.
Просто убедитесь, что он правильно подобран, чтобы избежать перефразирования, и оставайтесь чуть ниже 1,0 коэффициента нагрузки.
std::unordered_map m(503); // 503 is a prime
m.emplace(123, 234);
m.emplace(2345, 345);
std::cout << m.find(123)->second; // don't use operator[] to avoid creating entries
std::cout << m.find(2345)->second;
Чтобы проверить качество функции хеширования, выполните итерацию по всем сегментам, вызвав bucket_size()
и сложив что-либо выше 1 (то есть столкновение).
const int * i;
i
указатель на постоянное целое число. i
может быть изменен для указания на другое значение, но значение, указываемое i
не может быть изменен.
int * const i;
i
постоянный указатель на непостоянное целое число. Значение, которым указывают i
может быть изменен, но i
не может быть изменен для указания на другое значение.
const volatile int ip;
Этот довольно хитер. Факт это ip
const
средства, из которых компилятор не позволит Вам изменить значение ip
. Однако это могло все еще быть изменено в теории, например, путем взятия ее адреса и использования const_cast
оператор. Это очень опасно и не хорошая идея, но она позволяется. volatile
спецификатор указывает то любое время ip
получен доступ, это должно всегда перезагружаться из памяти, т.е. это не должно кэшироваться в регистре. Это препятствует тому, чтобы компилятор делал определенную оптимизацию. Вы хотите использовать volatile
спецификатор, когда у Вас есть переменная, которая могла бы быть изменена другим потоком, или если Вы используете ввод-вывод с отображенной памятью или другие аналогичные ситуации, которые могли бы вызвать поведение компилятор, не мог бы ожидать. Используя const
и volatile
на той же переменной довольно необычно (но законен) - Вы будете обычно видеть один, но не другой.
const int *i;
Это совпадает с первым объявлением.
Вы читаете объявления переменных в C/C++ справа налево, так сказать.
const int *i; // pointer to a constant int (the integer value doesn't change)
int *const i; // constant pointer to an int (what i points to doesn't change)
const volatile int ip; // a constant integer whose value will never be cached by the system
У каждого из них есть их собственные цели. Любой учебник C++ или половина достойного ресурса будут иметь объяснения каждого.