2016-08-08 21 views
5

tekrarlayıcılara arama Std :: class özelliği sınıf nesneleri vektör (örneğin. Ad)

vs ile döngüsü

  1. kullanarak herhangi bir fark performans/kasa-bazlı kontrol vektör elemanları var

    1. std: find_if (...)? döngü

    1.

    // 1. for loop 
    for (llvm::SmallVectorImpl<myClass>::const_iterator it = v.begin(); 
        it != v.end(); 
        ++it) { 
        if (it->getName() == Name) { 
         // found element 
         // do smth... 
         break; 
        } 
    } 
    

    vs

    2. std:

    // 2. find if 
    llvm::SmallVectorImpl<myClass>::const_iterator it 
        = std::find_if(v.begin(), 
            v.end(), 
            StringCheck<llvm::StringRef>(Name)); 
    if (it != v.end()) { 
        // found element 
        // do smth... 
    } 
    
    // StringCheck defined in header... 
    
    template <class T> 
    struct StringCheck{ 
        StringCheck(const T &s) : s_(s) {} 
        bool operator()(const myClass &obj) const 
        { 
         return obj.getName() == s_; 
        } 
    private: 
        const T &s_; 
    }; 
    
+0

Farklı bir şey "güvenli" değil. Performans için kıyaslama yapmalısınız. – StoryTeller

+0

Nihayetinde, 'std :: find_if' vektörü yineleyecek, bu yüzden performans farkı yok. – DimChtz

+0

Orada [* her iki şekilde de bir performans farkı olabilir.] (Http://stackoverflow.com/a/36988833/4892076) Bu tür bir fark, döngüyü gerçekten bir öznitelik olarak tanımlayamadığınız sürece, zamanından önce bir optimizasyon olacak kadar küçüktür. darboğaz olsa da, bu durumda profilleme kendiniz yapmak isteyeceksiniz. – jaggedSpire

cevap

0

find_if For döngüsü sonra yineleme devam Sizin bir eşleşme bulunur. Birden fazla eşleşme mümkün ise ve her eşleşme için kodu çalıştırmak istiyorsanız ya da bir eşleşme bulunduğunda durmak istediğinizde kötü bir şey varsa ve maç büyük bir kapta erken bulunursa bu iyi bir şey olabilir.

+0

Kullanımımda ilk maçtan sonra yinelemeyi bitirmek istiyorum, bu yüzden ara verdim; for döngüsünde. –