2014-12-11 21 views
11

C++ 11 any_of ila algorithm s ürününü tanıtmaktadır.any_of Versus find_if

Bu tam find_if gibi çalışıyor gibi görünüyor. function<bool(int)> foo; Ve bir dizi:

Bir functor var ki vector<int> bar;

görünüyor bu iki çağrıları da aynı işi görüyor gibi: Daha

any_of(bar.begin(), bar.end(), foo); 

ve

bar.end() != find_if(bar.begin(), bar.end(), foo); 

Ben all_of ve none_of öğelerininreddedilerek gerçekleştirilebilirbildirimi.

Bu algoritmalar bizim için end karşılaştırmasını yapmak için mi burada yoksa anlamıyorum bir kullanışlılık var mı?

+3

'dür. GCC'nin kütüphanesi, son == find_if_not/last == find_if /! None_of sırasıyla –

+0

@JonathanWakely olarak adlandırılan çağrılar için all_of/none_of/any_of komutunu uygular. Bunu kabul etmek isterim. –

cevap

16

Diğer yollarla elde edilebilecek işlevsellik için yalnızca daha uygun arabirimler olduklarına inanıyorum.

standart (N2666) eklemek için öneri diyor ki:

Bu üç algoritma

∄ sıradan matematiksel işlemler ∃, ∀ sağlamak ve a menzili ve bir yüklemi verilen bu yüklem olmadığını belirlemek tüm öğeler için doğrudur; 'un, yüklemenin doğru olduğu bir öğe olup olmadığı; veya yüklemenin doğru olduğu öğesinin olup olmadığı. Kesinlikle her üç bu algoritmaları ( !none_of ve any_of eşdeğerdir) sağlamak üzere gerek yoktur konuşan fakat bu operasyonların her üç eşit temel hissediyorum.

isimlerle

find_if karıştığı bir ifadenin daha ve bir (in) eşitlik (kesinlikle olmayan uzman C++ programcıları için) okumak için daha doğal ve daha kolaydır.

GCC standart kütüphane sadece diğer işlevlerini çağırarak onları uygular:

all_of(first, last, pred)return last == std::find_if_not(first, last, pred);

none_of(first, last, pred)return last == std::find_if(first, last, pred);

any_of(first, last, pred) Haklısın return !none_of(first, last, pred);

7

iki algoritmaların dönüş türü unutmayınız. Resim elemanı kriteri sekans bulunabilir ise lower_bound verdiği elemanın any_of den küçük olmayan birinci elemanına bir yineleyici döndürür ve birbirlerini tamamlayıcı find_if ise sadece gibi binary_search sadece döner. find_if gerçek haline yüklemi yapan elemana bir yineleyici döndürür iken binary_search, size sadece yüklem herhangi bir element için de geçerlidir eğer söyleyecektir !(val < lower_bound(a.begin(), a.end(), val))

any_of aynı (neredeyse) olduğuna dikkat edin. any_of tür kısıtlamaları yok iken Ayrıca, find_if garanti gerçek haline yüklemi yapan ilk öğeye bir yineleyici iade edileceğini unutmayınız. Böylece teoride bazı durumlarda any_of daha verimli olabilir.

+3

Ben gerçekten asıl soruya hitap ettiğinizi sanmıyorum - '' any_of' 'find_if (:: :)! = End()' için bir shorthand var mı? Konuyu konuyla ilgili son cümle ile dokunuyorsunuz ama bence bu geçen bir yorumdan daha fazlasını hak ediyor. – Angew

+1

@remyabel Bence bu açıklama sadece “any_of' * * daha verimli olabilir.” Diğer bir deyişle, "any_of" ifadesinde bir yineleyiciyi sürdürmeye veya döndürmeye gerek yoktur, aksi takdirde "any_of" için kullanılabilecek her öğeyi doğrusal olarak karşılaştırmaktan daha hızlı bir algoritma var. –

+2

@Angew sizin düşünceniz. Soruya kesin bir cevabım yok ve bu yüzden birçok olası açıklama önerdim: 1) Kıvam için (standartta benzer başka örnekler var) 2) Verimlilik için (any_of **, daha verimli olabilir) 3) Kullanım kolaylığı - 'any_if', 'any_of' ise sadece' any_of' kullanabileceğimiz yüklemle eşleşen öğelerin varlığını önemsersek 'find_if' için değil. Bunların verimliliğinin en önemli olduğu konusunda hemfikir değilim ve bundan ötürü, ortak uygulamaların herhangi birinin gerçekten çok daha verimli olduğundan şüphe duyuyorum. –

İlgili konular