Как уже отмечалось, предикатом для определения отсортированного состояния является O (n). Но из твоего упоминания о сортированном флаге я удивляюсь, не хочешь ли ты что-то вроде этого:
Базовые библиотеки нашего приложения включают в себя контейнерный класс, который можно запросить для членства. Вот краткий набросок:
class ObjList {
public:
ObjList() {};
~ObjList() {};
bool isMember(const Item *);
void add(const Item *, bool sort = false);
private:
unsigned int last_sorted_d;
bool sorted_d;
unsigned int count_d;
Item *store_d;
};
isMember () использует двоичный поиск по отсортированному диапазону элементов, а затем линейный поиск элементов после отсортированного диапазона. Вставка может инициировать сортировку элементов или нет, по выбору программиста. Например, если вы знаете, что будете добавлять тысячи элементов в узкий цикл, не сортируйте до окончательной вставки.
Выше приведен просто набросок, и магазин сложнее, чем массив указателей, но вы поняли.