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

  • CZTUTORIALS

    CZTUTORIALS

    28 Ocak 2011
  • DavidParody

    DavidParody

    17 EKİM 2009
  • Virtual Riot

    Virtual Riot

    19 Mayıs 2011