2012-02-21 50 views
1

我想編碼能夠返回的範圍迭代器以表示更大的列表的子集的方法。返回一個迭代範圍(主列表的子集)

可這樣的「子集」沒有正在取得連續的對象?

例如,如果我有n個對象一個std ::名單。

例如。

| object1 | object2 | object3 | object4 | ... | objectn 

我可以返回範圍迭代器(一對開始/結束我們可以稱之爲ItBegin和ItEnd),其中將包括唯一對象1,3和4?

例如。

| object1 | object2 | object3 | object4 | ... | objectN 
    ^    ^  ^     ^
    |     |   |      | 
    ItBegin   ++ItBegin ++ItBegin    ItEnd 

那是可能的,或者我需要複製的對象(或使用指針,以避免複製)到一個新的列表,並返回該列表?

請注意,迭代器(一個或多個)子集將只可用於閱讀。 (一對常量性的會做的工作)

謝謝! Giacomo

+1

迭代循環遵循特定的迭代順序。因此,您可以1)編寫使用特定「子集」選擇算法迭代相同集合的自定義迭代器,或者2)僅使用您需要的元素創建「子集」集合。 – vulkanino 2012-02-21 13:37:44

+0

如果您不是'std :: list',而是擁有一個隨機訪問的容器,例如,您的方法可以返回一個索引向量。另一種選擇是對容器進行排序,以便您需要的元素被連續存儲。 – jrok 2012-02-21 13:40:59

+0

添加我自己的評論,如果你擔心內存消耗,記住你的子集合可能只包含對象引用,而不是對象副本! – vulkanino 2012-02-21 13:43:01

回答

4

如果您不介意使用Boost,您可以使用filter_iterator,例如,

struct ShouldIncludeChecker 
{ 
    bool operator()(const Object& obj) const 
    { 
     return obj == object1 || obj == object3 || obj == object4; 
     //^Customize this to fit your need. 
    } 
}; 

typedef boost::filter_iterator<ShouldIncludeChecker, std::list<Object>::iterator> 
     filter_iterator; 

ShouldIncludeChecker checker; 
std::list<Object>::iterator old_begin = the_list.begin(); 
std::list<Object>::iterator old_end = the_list.end(); 
filter_iterator new_begin (checker, old_begin, old_end); 
filter_iterator new_end (checker, old_end, old_end); 

for (filter_iterator it = new_begin; it != new_end; ++ it) 
{ 
    // read *it 
} 

另外,如果你正在閱讀的東西可以做成一個輸出迭代器,你可以只使用std::remove_copy_if