Ускорить проблему с уникальным индексом multi_index

Я пытаюсь создать объект управления URL-адресом, используя boost::multi_index. Он имеет 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_;
};

Однако есть проблема, что не все предметы имеют свой ключ. Большинство элементов будут состоять только из позиции и пути. Я хочу, чтобы ключ был уникальным. Теперь проблема возникнет, когда я вставлю более одного неключевого элемента.

Можно ли разрешить ключу с пустой строкой иметь более одного элемента в контейнере. Если нет, что я должен сделать, чтобы преодолеть эту проблему?


person Saif Ur Rehman    schedule 02.06.2013    source источник
comment
В: Возможно ли иметь дубликаты ключей в уникальном индексе? О: Нет.   -  person Jonathan Wakely    schedule 03.06.2013


Ответы (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;
};
person Joaquín M López Muñoz    schedule 03.06.2013

Короткий ответ: вы не можете этого сделать. В качестве быстрого обходного пути рассмотрите возможность предоставления какой-либо уникальной строки, когда ключ отсутствует, например, какой-либо специальный символ, который предотвращает столкновение с реальными ключами, за которыми следует позиция (которая считается уникальной, верно?):

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;
};
person Joaquín M López Muñoz    schedule 03.06.2013