C++ (Qt)struct CData { int mFace; int * mFlag; ...};
C++ (Qt)void UnionFlag( CData & d0, CData & d1 ){ if (d0.mFace == d1.mFace && d0.mFlag && d1.mFlag && (*d0.mFlag & *d1.mFlag) == 0) { *d0.mFlag |= *d1.mFlag; d1.mFlag = d0.mFlag; }}
C++ (Qt)void UnionFlag(Container &c){if(foreach(func_if1, c) && foreach(func_if2, c) && ...) { ...}}
C++ (Qt)struct CJoinFrag { int mBeg, mEnd; // индексы диапазона элементов в сортированном массиве bool mDone; // флаг "объединено" CJoinFrag * mHead, * mNext; // см ниже};
C++ (Qt)#include <algorithm> struct CData{ int mFace; int * mFlag;}; void UnionFlag( CData & d0, CData & d1 ){ if (d0.mFace == d1.mFace && d0.mFlag && d1.mFlag && (*d0.mFlag & *d1.mFlag) == 0) { *d0.mFlag |= *d1.mFlag; d1.mFlag = d0.mFlag; }} using namespace { class MyFunctor { public: MyFunctor(const CData& bar):m_foo(bar) { } void operator() (CData& foo) { UnionFlag(m_foo, foo); } private: CData m_foo; }} // Container c; //... MyFunctor un = std::for_each(c.begin(), c.end(), MyFunctor(*c.begin())); std::for_each(c.begin(), c.end(), un);
C++ (Qt) std::stable_sort(c.begin(), c.end(), [](const CData& a, const CData& b){return a.mFlag<b.mFlag;}); typedef Container::iterator iterator; iterator cur = c.begin(); for(iterator a = c.begin(), a!=c.end(), a++) { if(cur->mFlag != a->mFlag) { MyFunctor un = std::for_each(first, a, MyFunctor(*first))); std::for_each(first, a, un); cur = a; } }
C++ (Qt) MyFunctor un = std::for_each(c.begin(), c.end(), MyFunctor(*c.begin())); std::for_each(c.begin(), c.end(), un);