-Исследование и удаление: это возможно для любого контейнера STL, но вопрос сколько времени требуется для этого. Любой контейнер с указанным списком (список, карта, набор) будет делать это в постоянное время, в то время как контейнеры (вектор), подобные массиву, будут делать это в линейном времени (с распределением с постоянной амортизацией).
-Сортинг: учитывая, что вы можете хранить отсортированную коллекцию в любое время, это не проблема, любой контейнер STL позволит это. Для карт и множеств вам не нужно ничего делать, они уже заботятся о том, чтобы сортировка всегда сортировалась. Для вектора или списка вам нужно выполнить эту работу, т. Е. Вам нужно выполнить двоичный поиск для места, где идут новые элементы, и вставить их туда (но для алгоритмов STL есть все необходимые для этого элементы).
-Resorting: Если вам нужно взять текущую коллекцию, которую вы отсортировали в соответствии с правилом A, и прибегнуть к коллекции в отношении правила B, это может быть проблемой. Контейнеры, такие как map и set, параметризуются (как тип) по правилу сортировки, это означает, что для его использования вам нужно будет извлечь каждый элемент из исходной коллекции и вставить их в новую коллекцию с новым правилом сортировки. Однако, если вы используете векторный контейнер, вы можете просто использовать функцию сортировки STL в любое время, чтобы прибегнуть к любому правилу, которое вам нравится.
-Random Access: Вы сказали, что вам нужен произвольный доступ. Лично мое определение случайного доступа означает, что любой элемент в коллекции может быть доступен (по индексу) в постоянное время.С этим определением (которое я считаю вполне стандартным) любая реализация связанных списков не квалифицируется, и она оставляет вам единственную возможность использования контейнера типа типа (например, std :: vector).
Заключение, чтобы иметь все эти свойства, вероятно, было бы лучше всего использовать вектор std :: и реализовать собственную сортированную вставку и сортировку удаления (выполнение двоичного поиска в векторе, чтобы найти элемент для удаления, или место для вставьте новый элемент). Если ваши объекты, которые вам нужно хранить, имеют значительный размер, а данные, в соответствии с которыми они отсортированы (имя, идентификатор и т. Д.), Невелики, вы можете рассмотреть вопрос о разделении проблемы, удерживая несортированный связанный список объектов (с полная информация) и сохранение сортированного вектора ключей вместе с указателем на соответствующий узел в связанном списке (в этом случае, конечно, используйте std :: list для первого и std :: vector для последнего).
Кстати, я не великий эксперт с контейнерами STL, поэтому, возможно, я ошибся в вышеупомянутом, просто подумайте о себе. Исследуйте STL для себя, я уверен, вы найдете то, что вам нужно, или, по крайней мере, все части, которые вам нужны. Возможно, посмотрите также на библиотеки Boost.
Насколько велика величина объекта, который вы собираетесь хранить в контейнере? Стоит ли копировать? Как часто элементы вставлены или удалены из середины контейнера? Вам нужен произвольный доступ к отдельным элементам? Вы смотрели на любой из контейнеров STL? –