There are far more evils than using break and continue.
In C++, using proper RAII technique there should be no problem in using these as your objects should be cleaned up the moment you exit scope. Same with returning in the middle of a function/loop.
It may be worth commenting at the start of the loop that it could terminate "early", i.e. the "while" condition is not the only thing that will cause a break. The important thing is to have clearly written code that is simple to understand. Loops shouldn't be so huge as to not see that it might be broken early.
For example a simple linear search might be:
template< typename FwdIter, typename Pred >FwdIter find( FwdIter iter, const FwdIter end, Pred pred )
{
for( ; iter != end; ++iter )
{
if( pred( *iter ) )
break;
}
return iter;
}
You could also put return iter in place of the break.