2013-02-26 17 views
19

C++ 11, döngüye (range-based for in c++11) göre aralık temelini tanıttığından, bir dizi tamsayı üzerinde döngülemeyi ifade etmenin en iyi yolu nedir? Bunun yerineBir dizi tam sayı üzerinde döngü yapmak için en iyi yol?

for (int i=0; i<n; ++i) 

ait

Ben

for (int i : range(0,n)) 

gibi bir şey yazmak istiyorum bu tür yeni standart destek şey var mı?

Güncelleme: Ben bunu tahmin

for (int i=0; i<n; ++i) 

ama: etkileyicisi yolu hala bu Generator in C++

+1

Neden ilk etapta bir dizi tamsayıya geçmek istiyorsunuz? – Xeo

+0

@Xeo, ciddi misin? Basit bir 'HelloWorld' programı olmayan bir C tamsayı parçasında bir dizi tamsayıya geçmek (oldukça eminim). Ya da demek istediniz: Neden bunun için aralık tabanlı 'for' kullanmak istersiniz? – paxdiablo

+0

@paxdiablo: Ölümcül biriyim. Bir dizi tamsayıya geçmek için iyi bir neden söyle. Bir şeyi dizine eklemek için bu tam sayıları kullanıyor musunuz? Bunun yerine döngü/yineleyin. Açık döngüler yüksek oranda hataya eğilimlidir. Bunları etkili bir şekilde kullanabilmem için tek gösterge referanslarıdır. – Xeo

cevap

19

saf C ile bunu yapamaz iken ++ (güncel C++ standart kütüphanesi capabilitie ile ler) boost yardımıyla yapabilirsiniz:

#include <boost/range/irange.hpp> 
#include <iostream> 

using namespace boost; 
using namespace std; 

int main(int argc, char **argv) 
{ 
    for(auto i : irange(1, 10)) 
     cout << i << "\n"; 
    return 0; 
} 

dahası, Boost.Range yeni for döngü ile kullanırken oldukça yararlı bulabildiğim birkaç daha ilginç aralıkları içerir. Örneğin, Boost.Range ile ters for döngü yapabilirsiniz.

+1

Temel olarak, kişi kendi başına temel alan gereksinimlerini tümüyle dolduran bir sınıf uygulayabilir. –

+1

@EuriPinhollow, Kötü bir ifadeyi seçtim. Şimdi güncellendi. – ixSci

12

: Bu makale C++ 11 bir dizi jeneratörü nasıl uygulanacağı açıklanır çok tertipli demezdim:

#include <iostream> 

int main() 
{ 
    for (auto i : { 1,2,3,4,5 }) 
    { 
    std::cout<<i<<std::endl; 
    } 
} 
+6

Sadece ilk cümle için + 1 vereceğim. Bazen eski yollar hala en iyisidir :-) – paxdiablo

+0

Elbette n pahalı bir ders ifadesi değilse, o zaman irange kısa ve verimli. – Macke

+1

Bu düzgün değil. Döngünün farkına varmak için bir araya getirmeniz gereken üç farklı zorlayıcı ifadeye sahiptir (ya da kılları bölmek istiyorsanız). Hiç düzgün değil. Ayrıca, 'i' nin anlamlı olup olmadığını veya yazarın sadece bir parça kodu n n kez çalıştırmak istediğini belirtmez. – einpoklum

2

Tamsayıdan ilgisi var ne bağlı olarak, std ile birlikte özellikle std::iota de <numeric> başlığını dikkate :: durumlarda bağlı dönüşümü ve std :: dolgu.

+0

Bütün bunları optimize etmek ve tekrar basit bir döngü oluşturmak için derleyiciye nasıl güvenebilirim? Özellikle 0 ... n-1 değerleri için bir yardımcı vektöre ihtiyacınız olabilir. – einpoklum

+1

Derleyici optimizasyonuna güvenmiyorsanız C not C++ kullanın. –

+0

_that_ compiler optimizasyonu türünden bahsetmiyorum. Ben daha çok dışarıda olanlardan bahsediyorum, çünkü derleyici gerçekten gerekli olmadıklarını söyleyebildiklerinde malloc ve ücretsiz aramaları kaldırmak gibi, burada ihtiyacınız olan şey budur. – einpoklum

İlgili konular