Как убедиться, что я работал с каждой парой элементов в std::set в цикле с вставкой?

std::set<BooleanFunction>::iterator  it;
for(it=closure.begin (); it!=closure.end (); ++it)
{ 

  std::set<BooleanFunction>::iterator  jit;
  for(jit=closure.begin (); jit!=closure.end (); ++jit)
  {

    for(uint i=0U; i<it->Arity (); ++i)
    { BooleanFunction  f = it->Superposition (*jit, i);

      if( f.Arity () <= test.Arity () )
       closure.insert (f);
    }
  }
}

Как я могу убедиться, что каждые два элемента имеют суперпозицию друг с другом?

Редактировать: Возможна самостоятельная суперпозиция: f(f(x)), f(f(f(x))), ... - все в порядке.

2 ответа

Решение

Я думаю, вы могли бы использовать 2 набора, как показано ниже.

std::set<BooleanFunction> builder
std::set<BooleanFunction>::iterator  it;
for(it=closure.begin (); it!=closure.end (); ++it)
{ 
    bulider.insert(*it);
    for(uint i=0U; i<it->Arity (); ++i)
    {
        BooleanFunction  f = it->Superposition (*it, i);
        if( f.Arity () <= test.Arity () )
            builder.insert (f);
    }
}

Экстра-гимнастика выглядит очень страшно:

void  smart_insert (std::set<BooleanFunction>  &closure,
                    std::set<BooleanFunction>::iterator  it,
                    std::set<BooleanFunction>::iterator jit,
                       const BooleanFunction   &f, uint arity)
{
  if( f.Arity () <= arity && closure.find (f) == closure.end () )
  { 
    if( f < *jit )
    { std::set<BooleanFunction>::iterator  nit;
      ++it;

      for(nit=closure.begin (); nit!=it; ++nit)
       for(uint i=0U; i<nit->Arity (); ++i)
       { BooleanFunction  ff = nit->Superposition (f, i);

         smart_insert (closure, nit, closure.find (f), ff, arity);
       } // end for i
    } // end if *jit
    if( f < *it )
    { std::set<BooleanFunction>::iterator  njit;
      ++jit;

      for(njit=closure.begin (); njit!=jit; ++njit)
       for(uint i=0U; i<f.Arity (); ++i)
       { BooleanFunction  ff = f.Superposition (*njit, i);

         smart_insert (closure, closure.find (f), njit, ff, arity);
       } // end for i
    } // end if *it
    closure.insert (f);
  } // end if arity & unique
}

// ...
std::set<BooleanFunction>::iterator  it;
for(it=closure.begin (); it!=closure.end (); ++it)
{ 

  std::set<BooleanFunction>::iterator  jit;
  for(jit=closure.begin (); jit!=closure.end (); ++jit)
  {

    for(uint i=0U; i<it->Arity (); ++i)
    { BooleanFunction  f = it->Superposition (*jit, i);

      smart_insert (closure, it, jit, f, test.Arity () );
    }
  }
}
Другие вопросы по тегам