Если ваш контейнер имеет итераторы произвольного доступа (например, вектор) и отсортирован, вы можете использовать алгоритм std::lower_bound()
для получения индекса элементов со сложностью O (log n). Например:
std::vector<int> v({10,20,30,30,20,10,10,20});
std::sort(v.begin(), v.end());
auto iter = std::lower_bound(v.begin(), v.end(), 20);
std::cout << "index " << int(iter - v.begin()) << std::endl;
(я использую синтаксис C ++ 11 для краткости кода, но вы должны понять).
Обратите внимание, что вы можете вставлять элементы в вектор отсортированным образом, поэтому вам не нужно выполнять сортировку перед поиском индекса.