2016-08-09 11 views
5

Özel rastgele erişim toplama sınıfım için bir yineleyiciye ihtiyacım var. Yineleyiciyi std::sort ile kullanmak istiyorum. Sınırlı bir zaman bütçesine sahip bir C++ newbee olduğum için, her şeyi kendim yazmaktan kaçınmak istiyorum.Neden boost'un counting_iterator yapısı nedir?

Yineleyicim temel olarak basit bir size_t. Bu nedenle, boost::counting_iterator'un iyi bir eşleşme olabileceğini düşündüm. Incrementable'u tamamladığımda, counting_iterator'un referans türünü const Incrementable& olarak tanımladığını anlamalıydım.

Hala bir çok C++ tarafından karıştırılmamıza rağmen, bu iteratörün std::sort ile kullanılmasını engelleyeceğine inanıyorum çünkü const yineleyicileri koleksiyon öğelerini değiştirmek için kullanılamaz.

İşte soru şu: neden boost::counting_iterator, başvuru türünü const olarak tanımlar ve daha önemlisi, bunun yerine ne kullanmalıyım?

+1

'boost :: counting_iterator', kapsayıcılara erişmek için kullanılamaz. 0, 1, 2, ... 'doğal sayılar dizisine" erişmek "için yaratılmıştır. Bu yüzden referans tipi bir “const” dir: 2'yi “3” haline getiremezsiniz. –

+0

"Özel rastgele erişim toplama sınıfım için bir yineleyiciye ihtiyacım var." Muhtemelen "Ben bir acemi" ile uyumlu değildir. Neden özel bir koleksiyon dersine ihtiyacın olduğunu sorabilir miyim? –

+0

"Yineleyicim temel olarak sadece basit bir" size_t "anlamıyorum.'size_t' yineleyici kavramının gereksinimlerini karşılamıyor – KABoissonneault

cevap

1

Neden boost :: counting_iterator referans türünü const olarak tanımlar?

Bunun amacı, as described here, yineleyici artırılır zaman kendisi artırılır bir nesneyle diziler doldurmaktır. Dokümanlarını (Boost uzmanı btw'si yok) kısa bir bakıştan geçirdiyseniz, elinizde bulunan Incrementable nesnesinin numaralı kopyasını tutuyor gibi görünüyor. Ardından, iç kopyayı değiştiren birini durdurmak için const kopyasını dahili kopyasına döndürür. I Incrementable tamamladığında

O counting_iterator const Incrementable & olarak referans türü tanımlar fark vardı.

Evet duruma gelmiş zaman kendisini sabit olmayan (dolayısıyla arttırılabilir ya da azaltılabilir olabilir) olan bu tutar Incrementable nesne sabit bir referans döndürür.

Bu, std :: sort ile yineleyiciyi kullanmamı engelleyeceğine inanıyorum çünkü const yineleyicileri koleksiyon öğelerini değiştirmek için kullanılamaz.

Doğru :) Altında-luk bir takas yerine ne kullanmalıyım

using T = size_t; 
T tmp = a; 
a = b; // requires a to be non-constant 
b = tmp; // requires b to be non-constant 

benziyor?

Konteynerinize bağlıdır. Bir kapsayıcıdaki yineleyici, kapsayıcıdaki bir öğeye bir işaretçi içermelidir. Muhtemelen standart bir yineleyici amaçlayabilirsin.

+0

Haklısınız, counting_iterator' açıkça farklı bir amaca sahiptir. Maalesef koleksiyonum koleksiyon öğesi için basit bir işaretçiye izin vermiyor. Koleksiyonum bir SQL ilişkisine benziyor ve öğelerini sütuna göre saklıyor. Diğer yandan yineleyici, satırdan erişime erişim sağlar, böylece tekrarlayıcıya okuma ve yazma işlemi bir tür çeviri sürecinden geçer. Basit işaretçiler bu nedenle bir seçenek değildir. –

+0

Hangi standart yineleyicileri düşünüyorsunuz? Yalnızca belirli koleksiyon türlerine bağlı yineleyicileri bulabilirim. –

+0

Ben bir SQL uzmanı değilim, ancak bir std :: tuple 'std :: vector's kullanıyorsanız o zaman bir yineleyici ile tuple boyunca yineleme mümkün olduğunu düşünmüyorum ([buraya bakın) Bunu nasıl yapabildiğiniz için] (http://stackoverflow.com/a/6894436/6367128)). Tüm vektörler aynı altta yatan tip içeriyor mu? Eğer öyleyse, sonra tuple kaçınmak ve vektörlerin bir vektörünü kullanabilirsiniz. – Judge