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

4 回答 4

5

很多时候,您需要编写多个列表和地图。常见的方法是从列表中的指针存储指向城市查找地图中城市的指针。或者你可以使用像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;
于 2009-05-23T16:01:48.633 回答
1

创建 a map<string,int> m;,其中值是 a 的索引vector<City>,例如m["NY"] == 0m["LA"] == 1

于 2009-05-23T15:59:04.263 回答
0

使用两个集合:

  • 按您感兴趣的顺序存储实际对象的列表。
  • 将名称映射到对象的映射。
于 2009-05-23T15:59:56.293 回答
0

最好的解决方案是使用Boost.MultiIndex,尽管这稍微复杂一些。不幸的是,我现在没有时间提供示例代码;对不起。

于 2009-05-23T20:08:10.967 回答