2014-11-19 17 views
8
  1. BOOST_FOREACH ve C++ 11 aralık temelli döngü arasındaki temel farklar nelerdir?
  2. Aralık tabanlı döngü yerine BOOST_FOREACH kullanmak isteyeceğim belirli bir durum var mı, yoksa tam tersi mi?

1.000.000 int değişken dolu std::vector ile küçük bir test yürütme sonra BOOST_FOREACH aralığı esas döngü biraz daha yavaş olduğunu ortaya koyduk (bir değişiyordu göre döngü için yaklaşık 1,25 kat daha uzun sürmüştür).Aralık tabanlı döngü için BOOST_FOREACH ve C++ 11 arasındaki fark nedir?

+0

Artık yeni kodda "foreach :: foreach" için bir kullanım olduğundan emin değilim. Bence eski kodlarda, daha önce menzilli temel döngüler olmadan önce yararlıdır. –

+0

Bunu mu demek istediniz: BOOST_FOREACH'? – Barry

+0

@Barry Evet, yapıyorum. Bunu düzeltmeme izin ver. –

cevap

16

Ana fark, bir dil yapısıdır, BOOST_FOREACH ise bu dil yapısına benzeyen bir şey yapmak için kaputun altında çok fazla sihir yapan bir makrodur. Tam olarak C++ 11'in sınırlamaları ile aynı şeyi yapmaya çalışıyor. BOOST_FOREACHhedefinin aralığıdır.

Orada bile aralık-için yerine BOOST_FOREACH kullanmanın düşünürdüm biri durum aynen olduğunu ve size tuple göz önüne sermek istediğiniz tüp bir kap üzerinde yineleme edilir: kıyasla

std::map<int, int> m; 
int key, value; 
BOOST_FOREACH(boost::tie(key, value), m) 
{ 
    // do something with key and value here 
} 

:

int key, value; 
for (const auto& pair : m) 
{ 
    std::tie(key, value) = pair; 
    // do something 
} 

Ben sonuçta o bile bir karar olarak bu dikkate değmez böyle küçük bir avantaj olsa sen, döngü başlığına doğrudan tie koyabilirsiniz böyle. Aralık için kullanın. Her zaman. hatta o küçük sözdizimsel avantaj kaldırmak structured bindings, tanıtacak


C++ 17: Bu noktada

for (auto const& [key, value] : m) 
{ 
    // do something 
} 

, BOOST_FOREACH kullanmak hiçbir neden yoktur olacaktır.

İlgili konular