代码之家  ›  专栏  ›  技术社区  ›  CW Holeman II

像列表一样排序,但通过键访问?

  •  1
  • CW Holeman II  · 技术社区  · 15 年前

    我用单子把城市安排成一次旅行。然后我重复一遍 显示旅行路线的列表。我想进入 城市是按名字而不是按旅游顺序排列的。所以,我 我以为我可以用地图而不是列表,但键决定了 命令。我还是想控制序列的顺序 但是能够通过一个键访问条目。

    这些功能可以结合起来吗?有什么标准的解决方法吗 这个?

    #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 回复  |  直到 15 年前
        1
  •  5
  •   grepsedawk    15 年前

    通常,您需要组合多个列表和映射。常用的方法是从列表中的指针存储指向按城市查找地图中城市的指针。或者你可以使用一个类 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;
    
        2
  •  1
  •   pts    15 年前

    创建一个 map<string,int> m; ,其中值是 vector<City> ,例如 m["NY"] == 0 m["LA"] == 1 .

        3
  •  0
  •   anon    15 年前

    使用两个集合:

    • 按感兴趣的顺序存储实际对象的列表。
    • 将名称映射到对象的映射。
        4
  •  0
  •   coppro    15 年前

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