Bir yineleyicinin işaret ettiği deque öğesinin dizinini döndürmem ve döndürmem gerekiyor. Bir yineleyiciden nasıl ayrılırım?C++'da, bir yineleyicinin int dizinini nasıl alabilirim?
cevap
std::ptrdiff_t index = std::distance(myDeque.begin(), curIterator);
Sen kullanabilirsiniz:
std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator));
böyle bir rutin çalışma zamanı maliyetlerinin farkında olun, bunu kullandığınız veri yapısına bağlıdır Ancak-.
size_t index = some_iterator - some_deque.begin()
Açıkçası bu (. std::list
ya da her türlü örneğin) tüm yineleyiciler için çalışmaz ama belli bir zerafet içinde var olduğunu teslim ediyorum:
Veya daha doğrusu yineleyici sınıfına bağlıdır (rastgele, ileri, vb) –
Numarayı bulmak için konteynerin her bir öğesi aracılığıyla mesafe adımları varsayalım, bu yüzden büyük bir deque için çalışma zamanı maliyeti büyük olacaktır. Bununla birlikte, benim dequeum 10 elementten daha büyük olmamalıdır. Ve mesafe bir int? Index() çağrısı ne yapar? – user83
Eğer deque'nizde 10'dan fazla elementin olmaması gerekiyorsa, o zaman 'vektör' kullanmanız gerektiğini veya en azından deque ile yapışmak için iyi bir mantığa sahip olmanızı rica ediyorum. Index() "call", "std :: distance" öğesinden dönüş değeriyle oluşturulmuş olan "index" adlı bir değişkendir. – fbrereto
rasgele erişimli adım adım elde için sadece çıkarma kullanabilirsiniz Bu tekniği yalnızca sabit zaman alacağı zaman kullanabileceğinizi. Konteyneriniz rasgele erişim yineleyicileri içermiyorsa, büyük olasılıkla yine de bunların indeksini bulmaya çalışmak mantıklı değildir. İki sunulan yöntemlerin dışında
Bence bu basitliği ve zarafeti için en iyi cevabı vereceğim. Sonucu bir int'ye atamak için bir int olarak atayabilir miyim? – user83
Bir int için atayabilirsiniz, ancak büyük olasılıkla daha yüksek uyarı düzeylerinde bir derleyici uyarısı alırsınız (ya imzalanmamış dönüşüm ya da derleyiciye bağlı olarak türün gerçek kısaltması vb.).Açıkça int için cast yapmak biraz can sıkıcı, ama bu senin deque içinde 2 milyardan fazla elemente sahip olmadıkça bir problemi gizlemeyecek - ki sanırım olmayacağından emin olabilirsin. – Peter
: İkinci rasgele erişim yineleyiciler için geçerlidir olmanın bir üstünlüğe sahiptir
std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator));
ve
std::ptrdiff_t index = some_iterator - some_deque.begin()
... - Başka kap için değiştirirken dolayısıyla Yanlışlıkla pahalı bir işlem yapmazsınız (örneğin listeler için O (n)).
- 1. Dizideki bir öğenin dizinini nasıl alabilirim?
- 2. Bir Gemideki bir Rails uygulamasının kök dizinini nasıl alabilirim
- 3. Omurga koleksiyonuna eklenen bir öğenin dizinini getirme yoluyla nasıl alabilirim?
- 4. Bir işleve iletilen yineleyicinin türünü nasıl yazarım?
- 5. Python yineleyici nesnesinin dizinini alın
- 6. Yineleyicinin kaldırma yöntemi aslında bir nesneyi kaldırır.
- 7. Bir Enum bir int nasıl?
- 8. Yolun üst dizinini nasıl bulurum?
- 9. Int nasıl dönüştürülür? int
- 10. C'deki unix zaman damgasını int cinsinden nasıl alabilirim?
- 11. Oluşturmak için bir repo klonlarken, TeamCity'yi .git dizinini oluşturmak için nasıl alabilirim?
- 12. javascript int dizgisi int dizilimi
- 13. Nasıl Convert NSIndexPath Int Int?
- 14. Yineleyicinin türü reverse_iterator olup olmadığını kontrol edin
- 15. java.util.Set içindeki bir öğenin endeksini nasıl alabilirim
- 16. Bir AlertDialog'dan sonuçları nasıl alabilirim?
- 17. Nasıl alınır .CDA, Windows 10 evrensel uygulamasında bir CD'den izler mi?
- 18. SQL AVG bir int dönüyor
- 19. Program Dosyaları dizinini nasıl edinebilirim?
- 20. Tomcat webapps dizinini nasıl bulur?
- 21. TemplateInfo.HtmlFieldPrefix'in liste dizinini nasıl değiştirebilirim?
- 22. JSON bir int nasıl ayrıştırılır?
- 23. Bir int özniteliği nasıl dönüştürülür?
- 24. git: bir dalın kök dizinini başka bir
- 25. Protobuf mesajına int int dizisi nasıl eklenir
- 26. Int (x) kullanmadan dize int nasıl dönüştürülür
- 27. Tomcat'ın çalışma dizinini IntelliJ
- 28. Bir toplu iş dosyasındaki dirname() eşdeğerini nasıl alabilirim?
- 29. Nasıl bir NSInteger bir int dönüştürebilirsiniz? Örneğin
- 30. Bir değer türünü string olarak nasıl alabilirim?
Dizine neden ihtiyaç duyuyorsunuz? Sadece nesneyi geçersiz kılabilir ve üzerinde yineleyici aritmetik yapamaz mısınız? –
Ne kadar? Yineleyiciden vazgeçme, bir işaretçiyi iptal etmek ve bana bellek adresini vermek, deque'deki yeri değil midir? – user83