2015-03-25 31 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; 
相關問題