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

  • Adam Outler

    Adam Outler

    19 EKİM 2006
  • Motor Trend Channel

    Motor Trend

    11 Mart 2006
  • theatre2film

    theatre2film

    12 NİSAN 2006