Yerinde bir öğesini silmek içinde en iyi yolu

oy
2

Ne var ki ben bu nesnelerin bir (veya daha fazla) artık silinmesi gerekir bu yineleme sırasında karar verebilir, ben boyunca yineleme nesneleri bir dizi var.

Benim kod aşağıdaki gibidir gider:

if( ! m_Container.empty() )
    {
        for(  typedefedcontainer::iterator it = m_Container.begin();
              it != m_Container.end(); 
              ++it  )
        {
            if( ! ( SomeFunction( (*it), test, TEST!, false ))  )
            {
            // If function returns false, delete object.
                m_Container.erase( it );
                AsyncResponseStore::iterator it = m_asyncResponses.begin();
            }

        }


    }

Ben bir nesneyi silmek Ama tabii ki, bir hata alıyorum: Harita / set yineleyici incrementable değil. Birisi bunu yapmanın daha iyi bir yolu önerebilirsiniz?

Bkz: sona başlar gelen yineleme sırasında bir harita elemanı üzerinde () silme diyoruz ne olur?

Oluştur 09/12/2008 saat 17:09
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
6

Konteyner destekliyorsa (ben senin değil şüpheli, ama soru başlık jenerik yani etmemeni eğer bu başkalarına yararlı olabilir):

struct SomePredicate {
    bool operator()(typedefedcontainer::value_type thing) {
        return ! SomeFunction(thing, "test", "TEST", false);
    }
};

typedefedcontainer::iterator it;
it = std::remove_if(m_Container.begin(), m_Container.end(), SomePredicate());
m_Container.erase(it, m_Container.end());

m_Container herhangi bir dizi veya İlişkili Kabı içeren bir silme aralığı yöntemi olması gerekir. Yine de bir değişken yineleyici sahip ilgisi var ve sadece ben aslen hata mesajı yanlış okumuş fark: o "harita / set yineleyici incrementable değil" diyor. Bu yüzden kapsayıcı bir harita veya bir dizi sanırım.

Son üç müthiş bir one-liner olabileceğini unutmayın, ancak bu marj bunu içerecek şekilde çok dar.

gerçek hayatta onlar sabit olmayan konum tahmin beri Ayrıca bu SomePredicate, bir_işlev başka parametreler depolamak için parametreleri ile bir kurucu olabilir.

functor inşa etmek bağlama: Eğer artırmak kullanırsanız, aslında tamamen SomePredicate kurtulmak başladı. Tek kullanımlık astar sonra gerçekten büyük olurdu.

[Düzenleme: Rob Walker doğru tüm silme yinelerler-ve-testi yapılır kadar ertelenmelidir edilebileceğini olan onun cevabını burada yapmak ve soru belirtilmemiş olduğunu bir varsayımda belirtiyor. Bir_işlev (örneğin küresel ya bir_işlev aslında bu bir üyesi fonksiyonu olduğu için) gizli bir yoldan m_Container erişirse, ve sonuç kabın içeriğine bağlıdır, sonra benim kod sorunu olanın koduna denk olmayabilir. Ama benim kod "bir neden olmadığı sürece değil" varsayılan olduğunu düşünüyorum.]

Cevap 09/12/2008 saat 17:39
kaynak kullanıcı

oy
6

Bu kap bağlıdır. Liste konteyner Listede bir sonraki öğeyi temsil silme yönteminden yeni yineleyici döndürerek numaralandırma sırasında silme destekler. haritası bu desteklemez.

Harita için basit bir yöntem ayrı bir listede silmek istediğiniz öğeleri birikir ve haritadan öğeleri silmek için harita işleme bittiğinde o liste yineleme etmektir. Bu yineleme tamamlanana kadar silme işlemini ertelemek varsayar. değil o zaman Eğer başka seçeneği ancak yeniden her silinmek üzere yineleme var.

Cevap 09/12/2008 saat 17:18
kaynak kullanıcı

oy
0

izleyerek Sabit:

for(  typedefedcontainer::iterator it = m_Container.begin();
      it != m_Container.end(); 
        )
{
    if( ! ( SomeFunction( (*it), "test", "TEST!", false ))  )
    {
    // If function returns false, delete object.
        m_Container.erase( it++ );
    }
    else
    { 
        ++i;
    } 

}

Bir öğe silindiğinde, buna bütün işaretçiler geçersiz kılınan hale gelir. Dolayısıyla bunu kullanarak ++ biz etrafında olsun. öneri yayınlanmıştır kişilere teşekkür ederiz.

Cevap 09/12/2008 saat 17:30
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more