返答遅れてすみません;;
h2so5 さんが書きました:質問している内容と添付しているコードの内容が一致していません。
要素を削除しているコードではなく、追加しているコードを貼るべきでしょう。
追加しているコードは少し深いところにあるので、ちょっと見づらいかもしれませんが
※敵オブジェクトの場合
コード:
// メイン ================================================================================================================================
bool C_ZakoObj::Obj_Main(){
(this->*MovePattern)(); // 行動関数ポインタ
MoveAdd(); // 移動
// 回転するタイプ
if( m_RotaAdd ) m_RotaAngle += m_RotaAdd;
AnimeAct();
// 敵が画面から外れたら消す
if( GetDelLineArea( 1 ) && CheckLimitCountOver() ){
m_Flag = false;
}
EnemyDelete(); // Lifeが0なら大破
m_MutekiTime -= m_MutekiTime == 0 ? 0 : 1; // 無敵時間を減らす
m_FlameCount ++; // 毎フレームカウント
return m_Flag;
}
MovePattern内で敵弾オブジェクトや、エフェクトオブジェクトが生成されます。
MovePatternは行動パターンの関数をいれます。
行動パターン関数
コード:
void C_ZakoObj::MovePattern001(){
if( Judge( 80, 120, 10 ) ){
Bullet->nway( m_X, m_Y, 1, GetAngleToPlayer(), 0, 4.0, e_BULLET_DAEN, m_Element );
}
}
Bullet->nwayでオブジェクトが追加されます。
内部でNewObjEntryが呼ばれます。
h2so5 さんが書きました:他の方法として、要素追加後の要素数に見当がつく場合、
追加前にreserveすることでイテレータの破壊を防止することができます。
reserveという手がありましたか、参考にさせていただきます。
YuO さんが書きました:
例えば確認処理がbool virtual C_ObjProcess::hasObject() const = 0;だとして,
コード:
m_ObjPt.erase(std::remove_if(m_ObjPt.begin(), m_ObjPt.end(), std::not1(std::mem_fn(&C_ObjProcess::hasObject))), m_ObjPt.end());
と,削除自体は一行になります。
もちろん,このままではメモリリークが発生するため,std::shared_ptrを使うのでしょうが,
std::shared_ptr使うとnot1とmem_fnの組み合わせがそのままでは使えなくなるので,ラムダ式を使って,
コード:
m_ObjPt.erase(std::remove_if(m_ObjPt.begin(), m_ObjPt.end(), [] (const std::shared_ptr<C_ObjProcess> & p) { return !p->hasObject(); }), m_ObjPt.end());
のようになりますが。
高度すぎて理解できませんでした///
参考にする前に解読したいと思いますw