2013-10-06 17 views
8

Okuma Çalışma Taslağı N3337-1, Standart Programlama Dili C++, 24.2.5 İleri yineleyiciler, sayfa taslak itibaren 806.C++ ISO standardı başına çoklu geçiş garantisi nedir?

:

İki dereferenceable yineleyiciler a ve tip bX teklif çoklu geçiş garantisi eğer: - a == b++a == ++b ve
eder -
X sivri tipte bir ya da ifade (void)++X(a), *a ifade *a denk olmasıdır.

[Not: (giriş ve çıkış yineleyicileri için doğru değildir) a == b++a == ++b eder gereksinimi ve (çıkış yineleyicileri için de geçerlidir), bir değişken iterasyon ile atamalarının sayısını kısıtlamaların kaldırılması kullanımına izin verir ileri yineleyici ile çoklu geçiş tek yönlü algoritmaların. —yarım notu]

Birisi bunu daha kolay bir şekilde yorumlayabilir mi? Forward yineleyicilerinin çok geçişli olduğunu anlıyorum, ancak bunun C++ standart gereksinimleri için nasıl gerçekleştirildiğini anlamıyorum.

+1

+1 Özel programlama problemini ele almasa bile, bu topluluğa uygun buluyorum ve çünkü C++ Standard'ı gerçekten okumak zor olabilir. – LihO

cevap

13

Terimler, herşeyi ifade eder, düşünürüm: diziyi birçok kez geçebilir ve sıra içindeki konumları hatırlayabilirsiniz. Sıra değişmediği sürece, belirli bir konumdan (yineleyici) başlayarak, aynı sırayla aynı sıklıkta aynı nesneler üzerinde hareket edersiniz. Ancak, ileri gidebilirsin, geriye doğru hareket etmenin bir yolu yok. Bunun gibi bir dizinin kanonik örneği, tek-bağlantılı bir listedir.

temelde eşit karşılaştıran iki yineleyicinızı varsa ve bunların her biri artırır varsa, aynı pozisyona almak ve eşit tekrar karşılaştırmak olduğunu söylüyor alıntılanan fıkra:

if (it1 == it2) { 
    ++it1; 
    ++it2; 
    assert(it1 == it2); // has to hold for multi-pass sequences 
} 

biraz garip ifadesi ++X(a), *a temel olarak a'dan bağımsız bir yineleyiciyi ilerletmek ve 'un 'a eşdeğer olması şartı temel olarak, bağımsız bir yineleyiciyi kullanarak yineleyici üzerindeki yineleyicinin, a'un ne ifade ettiğini değiştirmediği anlamına gelir. Bu, ++InIt(a), *a'un zorunlu olarak *a'a eşdeğer olmadığı giriş yineleyicisinden farklıdır, çünkü ilk ifade konumu değiştirebilir, muhtemelen a değerini geçersiz kılabilir ve/veya atıfta bulunduğu değeri değiştirebilir.

Buna karşılık, tek geçişli sıralama (standart terimlerle giriş ve çıkış yinelemeleri) yalnızca bir kez geçirilebilir: diziyi birden çok kez geçmeye çalışmak zorunlu olarak çalışmayacaktır. Bunun gibi sıralı kurallar klavyeden giriş ve konsola çıkıştır: okunduktan sonra, aynı karakterleri tekrar geri alamazsınız ve bir kez gönderildikten sonra karakterleri geri alamazsınız.