SORU
5 Kasım 2008, ÇARŞAMBA


Eğer sil dersen ne olur() end başlamak gelen yineleme sırasında bir harita öğesi.

Aşağıdaki kodda ben bir harita döngü ve eğer bir elemanın silinmesi gerekiyor eğer test. Öğe Sil ve yineleme tutmak için güvenli mi veya başka bir kap içinde anahtarları toplamak ve ikinci bir döngü sil arama yapmama gerek var mı()?

map<string, SerialdMsg::SerialFunction_t>::iterator pm_it;
for (pm_it = port_map.begin(); pm_it != port_map.end(); pm_it  )
{
    if (pm_it->second == delete_this_id) {
        port_map.erase(pm_it->first);
    }
}

GÜNCELLEME: tabii ki, ben ilgili olacağını sanmıyorum ki o read this question ama sorumu cevaplıyor.

CEVAP
5 Kasım 2008, ÇARŞAMBA


C 11

Bu C 11 (veya silme geliştirilmiş/tutarlı tüm konteyner türleri arasında yapılmış) olarak düzeltildi.
Silme yöntemi şimdi bir sonraki yineleyici döndürür.

while(pm_it != port_map.end())
{
    if (pm_it->second == delete_this_id)
    {
        pm_it = port_map.erase(pm_it);
    }
    else
    {
          pm_it;
    }
}

C 03

Bir haritada silme elemanları herhangi bir kullanımına kılmaz.
(öğenin yineleyicisi dışında silindi)

Aslında ekleme veya silme kullanımına herhangi kılmaz:

Ayrıca bu cevap:
Mark Ransom Technique

Ama kodunuzu güncellemeniz gerekir:
Kodunuzu pm_it silmek çağrıldıktan sonra artış. Bu noktada çok geç ve zaten geçersiz.

map<string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin();
while(pm_it != port_map.end())
{
    if (pm_it->second == delete_this_id)
    {
        port_map.erase(pm_it  );  // Use iterator.
                                  // Note the post increment.
                                  // Increments the iterator but returns the
                                  // original value for use by erase 
    }
    else
    {
          pm_it;           // Can use pre-increment in this case
                           // To make sure you have the efficient version
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HTC Tutorials

    HTC Tutorial

    21 EYLÜL 2010
  • julioissk84life

    julioissk84l

    18 ŞUBAT 2008
  • NicoleGrippo

    NicoleGrippo

    14 Kasım 2006