2013-06-02 91 views
1

我想创建一个使用boost :: multi_index的URL管理对象。它有2个索引,每个路径项目的一个索引位置和一个索引键来查找该项目。Boost multi_index unqiue索引问题

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

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

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

+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; 
}; 
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; 
}; 
+0

好主意,谢谢:) –