В подобных ситуациях вы можете обратиться к good reference.
std::vector
обеспечивает operator[]
с выполнением постоянная времени:
auto tenth_element = vehicle_vector[9];
std::unordered_set
оптимизирован для поиска элементов на основе (то есть, проверка того, присутствует ли или нет элемента). Редко вам потребуется 10-й элемент (тем более, что множество, по определению, неупорядоченный), но если вы делаете, вы берете итератор, увеличить его и разыменования ему:
auto tenth_element = *std::next(vehicle_set.begin(), 9);
Как правило, вы получаете доступ к элементам контейнера либо через функции-члены контейнера (такие как вектор operator []
выше), либо через итератор .
Итератор - это обобщение указателя - это некоторый неуказанный тип, который указывает на элемент в контейнере. Затем вы можете работать с итераторами, используя их функции-члены, такие как operator ++
или бесплатные функции, такие как std::next()
. Итераторы с произвольным доступом также поддерживают []
. Чтобы получить элемент, на который итератор «указывает», разыщите итератор, как *it
или it->whatever
.
Вы получаете итератор в начале контейнера, используя begin()
и итератор в один последний элемент, используя end()
. Контейнеры могут также предоставлять другие функции-члены, чтобы получить итератор для элемента - например, vehicle_set.find(aVehicle)
, который возвращает итератор в aVehicle
, если он присутствует в наборе, или итератор end()
, если это не так.
Какой член функции предлагает контейнер, зависит от того, какой контейнер он и в частности насколько эффективны операции. std::vector
не proivde find()
, потому что это было бы не лучше std::find()
- нет структуры в std::vector
для быстрого поиска. std::unordered_set
действительно предоставляет find()
, но не имеет operator []
, поскольку его итераторы не являются случайным доступом: доступ к n-й элемент неупорядоченного набора требует времени, пропорционального n.