Заказать как список, но доступ по ключу? - PullRequest
1 голос
/ 23 мая 2009

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

Можно ли объединить эти функции? Есть ли какой-то стандартный способ решения проблемы? это?

#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;
}

Ответы [ 4 ]

5 голосов
/ 23 мая 2009

Часто вам нужно будет составить несколько списков и карт. Распространенным способом является сохранение указателя на города в вашей карте поиска по городам из указателей в вашем списке. Или вы можете использовать класс типа Boost.MultiIndex , чтобы сделать то, что вы хотите, в том, что я бы сказал, намного чище. Он также гораздо лучше масштабируется и кода котельной пластины намного меньше, если вы хотите добавить новые индексы. Это также обычно более эффективное пространство и время

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 голос
/ 23 мая 2009

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

0 голосов
/ 24 мая 2009

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

0 голосов
/ 23 мая 2009

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

  • Список для хранения актуальных объектов в интересующем вас порядке.
  • Карта для сопоставления имен с объектами.
...