2015-01-20 2 views
2

Я начал вводить данные в vector и unordered_set с. Я разработал довольно легко, как поместить данные в, и я знаю, как получить данные, если мне нужно выгрузить все данные, например:Извлечение данных из векторов и неупорядоченных_секументов

for (auto i : vehicles) 
    MakeSpawnInfoVehicle(i.AddedInformation); 

Однако, я достиг точки где я хочу получить только один элемент информации либо из unordered_set s, либо из vector s, например, 10-ю запись в vector или unordered_set.

Если кто-то может предоставить базовый пример того и другого, я уверен, что я это пойму.

ответ

5

В подобных ситуациях вы можете обратиться к 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.

Смежные вопросы