制作一个C++迭代器,可以遍历两个容器

3
我需要一个“容器”,它应该像下面这样。它有两个子容器,称为A和B,我需要能够仅迭代A、仅迭代B以及组合迭代A和B。我不想使用额外的空间来存储冗余数据,所以我考虑制作自己的迭代器来迭代A和B的组合。如何最简单地制作自己的迭代器?或者,还有其他方法可以做到这一点吗?
编辑:最终,我认为这不是好的设计。我重新设计了整个类层次结构。+1进行重构。但是,我已经解决了这个问题。以下是我做的简化版本,供参考;它使用boost::filter_iterator。让T成为容器中的类型。
enum Flag
{
    A_flag,
    B_flag
};

class T_proxy
{
public:
    T_proxy(const T& t, Flag f) : t_(t), flag_(f) {}
    operator T() const {return t_;}
    Flag flag() const {return flag_;}
    class Compare
    {
    public:
        Compare(Flag f) : matchFlag_(f) {}
        operator() (const T_proxy& tp) {return tp.flag() == matchFlag_;}
    private:
        Flag matchFlag_;
    };
private:
    T t_;
    Flag flag_;
};

class AB_list
{
public:
    typedef T_proxy::Compare Compare;
    typedef vector<T_proxy>::iterator iterator;
    typedef boost::filter_iterator<Compare, iterator> sub_iterator;
    void insert(const T& val, Flag f) {data_.insert(T_proxy(val, f));}
    // other methods...

    // whole sequence
    iterator begin() {return data_.begin();}
    iterator end() {return data_.end();}

    // just A
    sub_iterator begin_A() {return sub_iterator(Compare(A_flag), begin(), end());
    sub_iterator end_A() {return sub_iterator(Compare(A_flag), end(), end());

    // just B is basically the same
private:
    vector<T_proxy> data_;
};


// usage
AB_list mylist;
mylist.insert(T(), A_flag);
for (AB_list::sub_iterator it = mylist.begin_A(); it != mylist.end_A(); ++it)
{
    T temp = *it; // T_proxy is convertible to T
    cout << temp;
}
3个回答

7

我会转发我的类似问题的回答。我认为这将实现您想要的功能。

使用像Boost.MultiIndex这样的库来实现您想要的功能。它可以很好地扩展,并且如果您想添加新索引,则有更少的样板代码。它通常也更节省空间和时间

typedef multi_index_container<
  Container,
  indexed_by<
    sequenced<>, //gives you a list like interface
    ordered_unique<Container, std::string, &Container::a_value>, //gives you a lookup by name like map
    ordered_unique<Container, std::string, &Container::b_value> //gives you a lookup by name like map
  >
> container;

如果您正在迭代一个索引,您可以使用库中的迭代器投影概念切换到另一个索引。

Boost.MultiIndex似乎没有排除元素的方法。 - rlbond

0

有一个容器,它存储您感兴趣的值以及一个指示它是在A还是B中的标志。


0
你还可以创建一个包含std::pair<>对象的单个容器。
Billy3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接