2012-09-25 54 views
0

我有一個multi_index_container,其索引是composite_key。 但我無法找到一種方法來清除元素的密鑰。 請參閱以下內容:使用composite_key從multi_index_container中擦除每個鍵的元素

#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/member.hpp> 
#include <boost/multi_index/hashed_index.hpp> 
#include <boost/multi_index/composite_key.hpp> 

using namespace boost::multi_index; 

struct Point 
{ 
    int x, y; 
}; 

void func() 
{ 
    multi_index_container<Point,indexed_by< 
    hashed_unique< 
     composite_key<Point, 
        member<Point,int,&Point::x>, 
        member<Point,int,&Point::y> > 
     > > > points; 

    points.find(boost::make_tuple(3, 3)); // <- works 
    points.erase(boost::make_tuple(3, 3)); // <- failes to compile 
} 

擦除(鍵)工作,該不是綜合指數。但我無法找到複合鍵的正確語法。

回答

2

erase沒有重載允許互操作與元組(從技術上說,這涉及到的compatible extensions概念。)的類型,但是你可以有一點點更多的代碼相同的效果:

auto p=points.equal_range(boost::make_tuple(3,3)); 
points.erase(p.first,p.second); 
+0

好吧,但我想知道這是什麼的簽名是否爲' size_type擦除(key_param_type x)'。我在預處理的代碼中找到它。有沒有辦法用composite_key調用它? –

+0

另一件事:擦除(迭代器,迭代器)返回一個迭代器。哈希指數可能需要很長時間,不是嗎?如果它以某種方式可能,我仍然傾向於調用擦除(鍵)。 –

+0

爲什麼擦除沒有擴展到處理兼容密鑰的原因是'template 迭代器擦除(const CK&ck)'會在我們稱之爲擦除(它)的情況下與現有的迭代器擦除(迭代器) '有一個*不是'iterator'的對象,但可以轉換爲'iterator'。我承認,有點病態。 –

0

根據您的要求添加到上一個答案。你可以這樣說:

Point p={3,3}; 
points.erase(points.key_extractor()(p)); 

與此唯一的問題是,它不適合(如果Point是構建昂貴。)

相關問題