다음과 같이 작동하는 "컨테이너"가 필요합니다. A와 B라는 2 개의 하위 컨테이너가 있으며 A, B 및 A와 B를 결합하여 반복 할 수 있어야합니다. 여분의 데이터에 여분의 공간을 사용하고 싶지 않기 때문에 A와 B를 반복하여 반복 할 자체 반복자를 만드는 방법을 생각했습니다. 자체 반복자를 만드는 가장 쉬운 방법은 무엇입니까? 또는, 이것을하는 또 다른 방법은 무엇입니까?2 컨테이너를 탐색하는 C++ 반복자 만들기
편집 궁극적으로 나는 좋은 디자인이라고 생각하지 않습니다. 나는 전체 계층의 계층 구조를 재 설계했다. +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;
}
Boost.MultiIndex에는 요소를 제외하는 방법이없는 것 같습니다. – rlbond