SORU
29 NİSAN 2009, ÇARŞAMBA


std için remove_if eşdeğeri::göster

Harita özel durumuna göre öğelerin aralığını silmeye çalışıyordum. Nasıl STL algoritmaları kullanarak yapacağım?

Başlangıçta ama remove_if ilişkilendirilebilir kapsayıcı için çalışmıyor olarak mümkün değildir remove_if kullanarak düşündüm.

"Harita için çalışır?" algoritma eşdeğer remove_if var mı

Basit bir seçenek olarak, harita ve silme döngü düşündüm. Ama harita döngü ve güvenli bir seçenek silme?(silme işleminden sonra) geçersiz elde yineleyicisi olarak

Aşağıdaki örnek kullanılır:

bool predicate(const std::pair<int,std::string>& x)
{
    return x.first > 2;
}

int main(void) 
{

    std::map<int, std::string> aMap;

    aMap[2] = "two";
    aMap[3] = "three";
    aMap[4] = "four";
    aMap[5] = "five";
    aMap[6] = "six";

//      does not work, an error
//  std::remove_if(aMap.begin(), aMap.end(), predicate);

    std::map<int, std::string>::iterator iter = aMap.begin();
    std::map<int, std::string>::iterator endIter = aMap.end();

    for(; iter != endIter;   iter)
    {
    		if(Some Condition)
    		{
                            // is it safe ?
    			aMap.erase(iter  );
    		}
    }

    return 0;
}

CEVAP
29 NİSAN 2009, ÇARŞAMBA


Neredeyse.

for(; iter != endIter; ) {
            if (Some Condition) {
                    aMap.erase(iter  );
            } else {
                      iter;
            }
}

Ne olduğunu aslında yineleyici artış oluriki kezeğer bir öğe sildin eğer; silinmesi gereken öğeleri üzerinden atlamak olabilir.

Bu ve pek çok yerde kullanılan belgelenen gördüğüm ortak bir algoritma.

[DEĞİŞTİR] kullanımına silme sonra geçersiz olduğu doğru, ama sadece kullanımına silinir eleman, başvuran, diğer kullanımına hala geçerlidir. Dolayısıyla silmek içinde iter kullanarak() arayın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Baby Big Mouth

    Baby Big Mou

    5 Mart 2013
  • circuschina

    circuschina

    16 Mart 2007
  • TomOdellVEVO

    TomOdellVEVO

    29 Mayıs 2012