2013-03-05 20 views
17

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?

+2

, 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

cevap

26

İ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; 
    }()); 
+1

Böylesi basit bir yardımcı ile, çoğu derleyici kopyasını tamamen eleyecektir. – Agentlien

+2

Bu arada, * geçerli * standardına göre lambda'nızın bir '-> std :: vektörü ' olması gerektiğini düşünüyorum. –

+0

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

0

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.

+3

Burada bir "constexpr" ye gerek yoktur, çünkü derleme zamanı sabit ifadesine gerek duymaz (bir "std :: vektör" iadesi asla olamaz). Bu mümkün –

0

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 
} 
+0

, ancak OP bir tek * const * vektörü sorar. – stijn

+0

@stijn Ohh evet. Fakat geçici bir ara vektör kullanabilir ve daha sonra sizin yaklaşımınız çağrılan fonksiyonda bir tane oluşturduğundan, 'const' vektörüne atayabilirim. – Saksham

İlgili konular