2015-03-25 76 views
1

我正在使用boost:multi_index_container。 以下是代码如何添加在multi_index_container中指定的唯一索引

#include <string> 
#include <boost/multi_index_container.hpp> 
#include "boost/multi_index/global_fun.hpp" 
#include "boost/multi_index/hashed_index.hpp" 
#include <boost/multi_index/sequenced_index.hpp> 
#include "boost/multi_index/mem_fun.hpp" 
#include "boost/multi_index/member.hpp" 
#include "boost/multi_index/ordered_index.hpp" 
#include "boost/multi_index/indexed_by.hpp" 

using namespace std; 

class uri 
{ 
public: 
    string str; 
    uri(string s) :str(s) 
    { 
    } 
    string getUri(){ return str; } 

}; 


struct UriWithBase 
{ 
    UriWithBase(uri u1, uri u2) :link(u1), baseLink(u2){} 
    uri link; 
    uri baseLink; 
}; 



int main() 
{ 
    typedef boost::multi_index::multi_index_container < 
     UriWithBase*, 
     boost::multi_index::indexed_by < 
     boost::multi_index::sequenced < > 
     > 
    > UriMultiIndex; 

    UriMultiIndex m_uris; 

    uri urib1("www.google.com"); 
    uri uri1("www.news.google.com"); 

    UriWithBase *ubptr = new UriWithBase(uri1, urib1); 

    m_uris.push_back(ubptr); 
    return 0; 
} 

现在我想添加一个有序的唯一索引指定的multi_index_container。此索引是针对容器中元素的唯一顺序取决于“UriWithBase”类的第一个元素,即uri链接。 我试过但没有工作。 的boost :: multi_index :: ordered_unique <

boost::multi_index::tag<uris_by_uri>, 
BOOST_MULTI_INDEX_CONST_MEM_FUN(UriWithBasePtr, const uri&, (*(UriWithBasePtr)).link)> 

回答

0

有一些方法来添加一个有序索引:通过使用ordered_unique specifier使用自定义比较

class uri 
{ 
public: 
    string str; 
    uri(string s) :str(s) 
    { 
    } 
    string getUri() const { return str; } 
}; 

struct UriWithBase 
{ 
    UriWithBase(uri u1, uri u2) :link(u1), baseLink(u2){} 
    uri link; 
    uri baseLink; 
}; 

struct CUriComparator { 
    bool operator()(const uri &lh, const uri &rh) const { 
     return lh.str < rh.str; 
    } 
}; 

struct uris_by_uri_and_crawl_state {}; 

typedef boost::multi_index::multi_index_container < 
    UriWithBase*, 
    boost::multi_index::indexed_by < 
     boost::multi_index::sequenced<>, 
     boost::multi_index::ordered_unique < 
     boost::multi_index::tag<uris_by_uri_and_crawl_state>, 
     BOOST_MULTI_INDEX_MEMBER(UriWithBase, uri, link), 
     CUriComparator 
     > 
    > 
> UriMultiIndex; 
一起

  1. 通过定义01的比较运算符通过声明在UriWithBase类返回linkstr部件值的方法(UriWithBase::getLinkUri)类

    class uri 
    { 
    public: 
        string str; 
        uri(string s) :str(s) 
        { 
        } 
        string getUri(){ return str; } 
        bool operator < (const uri &rh) const { 
         return this->str < rh.str; 
        } 
    }; 
    
    struct UriWithBase 
    { 
        UriWithBase(uri u1, uri u2) :link(u1), baseLink(u2){} 
        uri link; 
        uri baseLink; 
    }; 
    
    struct uris_by_uri_and_crawl_state {}; 
    
    typedef boost::multi_index::multi_index_container < 
        UriWithBase*, 
        boost::multi_index::indexed_by < 
         boost::multi_index::sequenced<>, 
         boost::multi_index::ordered_unique < 
          boost::multi_index::tag<uris_by_uri_and_crawl_state>, 
          BOOST_MULTI_INDEX_MEMBER(UriWithBase, uri, link) 
         > 
        > 
    > UriMultiIndex; 
    
  2. class uri 
    { 
    public: 
        string str; 
        uri(string s) :str(s) 
        { 
        } 
        string getUri() const { return str; } 
    }; 
    
    struct UriWithBase 
    { 
        UriWithBase(uri u1, uri u2) :link(u1), baseLink(u2){} 
        uri link; 
        uri baseLink; 
    public: 
        string getLinkUri(void) const { 
         return link.getUri(); 
        } 
    }; 
    
    struct uris_by_uri_and_crawl_state {}; 
    
    typedef boost::multi_index::multi_index_container < 
        UriWithBase*, 
        boost::multi_index::indexed_by < 
         boost::multi_index::sequenced<>, 
         boost::multi_index::ordered_unique < 
          boost::multi_index::tag<uris_by_uri_and_crawl_state>, 
          BOOST_MULTI_INDEX_CONST_MEM_FUN(UriWithBase, string, getLinkUri) 
         > 
        > 
    > UriMultiIndex; 
    
+0

感谢您详细的解答,这将是在索引标识的变化如果我存储共享“UriWithBase”类,而不是正常的指针的指针。共享指针声明如下:typedef boost:shared_pt UriWithBasePtr; – BSalunke 2015-03-26 09:51:11

+0

@BSalunke,我认为不应该是问题。只是将第三种情况的'UriWithBase *'替换为'boost :: shared_ptr ',代码编译时没有错误。 – megabyte1024 2015-03-26 10:00:13

1
class uri 
{ 
public: 
    string str; 
    uri(string s) :str(s) 
    { 
    } 

    // note we made this const 
    string getUri() const { return str; } 
}; 

inline bool operator<(const uri& x,const uri& y) 
{ 
    return x.getUri()<y.getUri(); 
} 

... 

typedef boost::multi_index::multi_index_container < 
    UriWithBase*, 
    boost::multi_index::indexed_by < 
    boost::multi_index::sequenced < >, 
    boost::multi_index::ordered_unique< 
     boost::multi_index::tag<uris_by_uri_and_crawl_state>, 
     boost::multi_index::member<UriWithBase,uri,&UriWithBase::link> 
    > 
    > 
> UriMultiIndex;