const vector
, örneğin rasgele sayılar oluşturmak için generate_n
gibi bir şey kullanmak mümkün mü? vector
türetmeden ve yapıcıda atamayı yapmadan bunu yapmanın bir yolunu düşünemedim.C++ 11 kullanarak işlev sonuçlarının bir const vektörünü nasıl başlatırsınız?
cevap
İsterseniz statik bir yardımcı veya lambda kullanın; semantics/copy elision'ı yorumlarda belirtildiği gibi hareket ettirmek, tüm iyi derleyiciler, yardımcı tarafından döndürülen vektörün tam bir kopyasını çıkartacağından bu oldukça ucuza gelecektir. Bunun yerine, tek bir vektörü doldurmak için kodu oluşturacaklar ve sonra bunu kullanacaklar.
const std::vector<int> my_const_vec([]()
{
const size_t n = 10;
std::vector<int> x(n);
std::generate_n(x.begin(), n, someGenerator);
return x;
}());
Böylesi basit bir yardımcı ile, çoğu derleyici kopyasını tamamen eleyecektir. – Agentlien
Bu arada, * geçerli * standardına göre lambda'nızın bir '-> std :: vektörü
hmm şimdi kafam karıştı. Gcc4.7 ve cl17.00 ile çalıştı ve her ikisi de kabul etti, ama aslında her ikisinin de önceki sürümlerini reddettiğini hatırlıyorum. – stijn
bir fonksiyonu haline başlatma Encapsulate ve bir const ifadesini başlatmak için kullanabilirsiniz böylece "constexpr" ilan: Burada
std::vector<int> Helper()
{
const size_t n = 10;
std::vector<int> x(n);
std::generate_n(x.begin(), n, someGenerator);
return x;
}
const std::vector<int> my_const_vec(Helper());
lambda versiyonudur.
Burada bir "constexpr" ye gerek yoktur, çünkü derleme zamanı sabit ifadesine gerek duymaz (bir "std :: vektör" iadesi asla olamaz). Bu mümkün –
Sen std::transform
kullanabilirsiniz yanı işlev olduğunu
vector<int> vec(10,1);
transform(vec.begin(), vec.end(), vec.begin(), func);
: Ben şimdi bu bir cevap biliyorum
int func(int i)
{
//return a random generated number
}
- 1. C++ Bir sınıf vektörünü algoritmayı kullanarak filtrelemek için
- 2. C++ işlev dönen const karakter *
- 3. Bir const işaretçisi vektörünü const olmayan işaretçilerden oluşan bir vektöre const_cast nasıl?
- 4. C++ 11 varsayılan işlev argümanları olarak 11 lambdas
- 5. C++ 11
- 6. C++ dizelerinin bir vektörünü nasıl yinelemeli?
- 7. C++ 11
- 8. hızlı aralığı (C++ 11)
- 9. En ++ C++ 11 sınıfı C++ 11 referans veya değer olarak
- 10. Git deposunu nasıl başlatırsınız?
- 11. Yansıtmayı kullanarak, bir struct pointer alanının değerini nasıl başlatırsınız?
- 12. C++ 11 - sıralama işlevini
- 13. Xzx1 vektörünü <const T>'ye çevir
- 14. Sütun vektörünü kullanarak çok boyutlu tabloyu dizinlemek
- 15. C# de const-doğruluk nasıl elde edilir?
- 16. Bir STL vektörünün içindeki bir C++ STL vektörünü bulmak için
- 17. Bir işlev/yöntem imzası sonrasında const nedir?
- 18. C++ 11 unordered_set öğesini Visual C++ ve clang kullanarak
- 19. Bir const yapısını bir işlev kullanmadan başlatmak mümkün mü?
- 20. Neden C++ 11 rasgele dağılımlar değişebilir?
- 21. C++ 11 başlatıcısı belirsiz işlev id-ifadesiyle? Aşağıdaki C++ 11 kodunda
- 22. Std :: vektörünü diziye dönüştür.
- 23. derleme C++ 11 Program makefile
- 24. C++ bir const std :: string &?
- 25. C++ 11 sanal kopya oluşturucu
- 26. C++ 11
- 27. Bir C++ vektörünü filtrelemek veya "grep" etmek nasıl?
- 28. Bir std :: vektörünü C++ sınıf kurucusunda nasıl başlatıyoruz?
- 29. C++ 11: std :: function :: target()
- 30. Düzenleme modunda bir UITextView (iPhone) nasıl başlatırsınız?
, ama sadece Bilginize 'in' vector' (ya da diğer tür kaynaklanan std' ad alanı özellikle türetilmemelidir) [riskli] (http://stackoverflow.com/questions/2034916/is-it-okay-to-inherit-implementation-from-stl-containers-rather-than-delegate – boycy