1

我正在尝试使用 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_;
};

但是有一个问题,并非所有项目都有它的关键。大多数项目只包含位置和路径。我希望 key 是唯一的。现在,当我插入多个非关键项时,问题就会出现。

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

4

2 回答 2

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;
};
于 2013-06-03T10:08:18.803 回答
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;
};
于 2013-06-03T08:10:07.940 回答