2009-05-23 4 views
1

Я использовал список, чтобы поместить города в путешествие. Затем я перебираю список , чтобы отобразить маршрут поездки. Я хотел бы получить доступ к городам по названию, а не по заказу поездки. Итак, я думал, что могу использовать карту, а не список, но ключ определяет заказ. Я все равно хотел бы управлять порядком последовательности , но иметь возможность доступа к записям с помощью ключа.Закажите, как список, но доступ к ключу?

Могут ли эти функции сочетаться? Есть ли стандартный способ обратиться к ?

#include <list> 
#include <iostream> 
struct City{ 
    City(std::string a_n, int a_d):name(a_n), duration(a_d){} 
    std::string name; 
    int duration; 
}; 
int main(){ 
    std::list<City*> trip; 
    trip.push_back(new City("NY", 5)); 
    trip.push_back(new City("LA", 2)); 
    for (std::list<City*>::iterator ii=trip.begin(); ii!=trip.end(); ++ii) 
     std::cout << (*ii)->name << " for " << (*ii)->duration << " days." <<std::endl; 
} 
+1

Youn не должен использовать HTML-теги для форматирования сообщений SO. Чтобы форматировать код, выберите весь код с помощью мыши и введите Ctrl-K. – 2009-05-23 15:58:20

+0

Нейл - В чем дело с тегами HTML? Если это оскорбляет вас, тогда не стесняйтесь редактировать сообщение и исправлять его. Не нужно сердиться на это –

ответ

5

Часто вам нужно будет составить несколько списков и карт. Обычным способом является сохранение указателя на Города в карте поиска по городу с указателей в вашем списке. Или вы можете использовать такой класс, как Boost.MultiIndex, чтобы делать то, что вы хотите, в том, что я бы сказал, намного чище. Он также масштабируется намного лучше, и есть намного меньше кода котловой плиты, если вы хотите добавить новые индексы. Кроме того, как правило, more space and time efficient

typedef multi_index_container< 
    City, 
    indexed_by< 
    sequenced<>, //gives you a list like interface 
    ordered_unique<City, std::string, &City::name> //gives you a lookup by name like map 
    > 
> city_set; 
1

Создать map<string,int> m;, где значения являются индексы в vector<City>, например m["NY"] == 0 и m["LA"] == 1.

+1

Доступ к списку по индексу - это дорогостоящая операция. Карта имени для итератора была бы более разумной. – 2009-05-23 16:06:57

+0

Изменен 'list' на' vector' в моем ответе. Спасибо, что вызвали это. – pts

0

Используйте две коллекции:

  • список, чтобы сохранить фактические объекты в порядке, вы заинтересованы в
  • карты для отображения имен объектов..
0

Лучшим решением является использование Boost.MultiIndex, хотя это немного сложнее. К сожалению, у меня нет времени, чтобы предоставить образец кода; Прости.

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