提升multi_index唯一索引问题

时间:2013-06-02 22:24:46

标签: c++ boost indexing boost-multi-index

我正在尝试使用boost :: multi_index创建一个URL管理对象。它有2个索引,每个路径项的一个索引位置和一个索引键来找到该项。

class InternalPath
  {
  public:
    struct PathItem
    {
      int Position;
      std::string Key;
      std::string Path;
    };

    typedef boost::multi_index_container<
      PathItem,
      boost::multi_index::indexed_by<
        boost::multi_index::ordered_unique<boost::multi_index::member<PathItem,int,&PathItem::Position>>,
        boost::multi_index::ordered_unique<boost::multi_index::member<PathItem,std::string,&PathItem::Key>>
      >
    > PathContainer;

  private:
    PathContainer path_;
};

然而,存在一个问题,即并非所有物品都具有它的关键。大多数项目只包括位置和路径。我希望钥匙是独一无二的。现在当我插入多个非关键项时会出现问题。

是否可以允许带有空字符串的键在容器中有多个项目。如果不是我该怎么做才能克服这个问题?

2 个答案:

答案 0 :(得分:2)

使用Boost.Variant稍微更优雅的解决方案:

struct PathItem
{
  PathItem(int p,const std::string& k,const std::string& pt):
    Position(p),Key(k),Path(pt){}

  PathItem(int p,const std::string& pt):
    Position(p),Key(p),Path(pt){}

  int Position;
  boost::variant<int,std::string> Key;
  std::string Path;
};

答案 1 :(得分:1)

简短的回答是你不能这样做。作为一种快速的解决方法,考虑在没有密钥时提供一些唯一的字符串,例如一些特殊字符可防止与真实密钥冲突,后跟位置(假设是唯一的,对吧?):

struct PathItem
{
  PathItem(int p,const std::string& k,const std::string& pt):
    Position(p),Key(k),Path(pt){}

  PathItem(int p,const std::string& pt):
    Position(p),Key("!"),Path(pt){Key+=p;}

  int Position;
  std::string Key;
  std::string Path;
};