2013-03-05 46 views
17

Có thể sử dụng một cái gì đó như generate_n để tạo số const vector, ví dụ, số ngẫu nhiên không? Tôi không thể nghĩ ra một cách để làm điều đó mà không phát sinh vector và thực hiện nhiệm vụ trong hàm tạo.Làm cách nào để bạn khởi tạo vectơ const của các kết quả hàm bằng C++ 11?

+2

Tôi biết bạn có câu trả lời cho điều này bây giờ, nhưng chỉ FYI bắt nguồn 'vector' (hoặc loại khác trong ' không gian tên std' không được dự định cụ thể để được dẫn xuất) là [rủi ro] (http://stackoverflow.com/questions/2034916/is-it-okay-to-inherit-implementation-from-stl-containers-rather-than-delegate) – boycy

Trả lời

26

Sử dụng trình trợ giúp tĩnh hoặc lambda nếu bạn muốn; di chuyển ngữ nghĩa/sao chép elision như chỉ ra trong các ý kiến ​​sẽ làm cho điều này khá rẻ vì tất cả các trình biên dịch phong nha sẽ bỏ qua một bản sao đầy đủ của vector trả về bởi người trợ giúp. Thay vào đó, họ sẽ chỉ tạo mã để điền vào một véc tơ duy nhất và sau đó sử dụng mã đó.

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()); 

đây là phiên bản lambda:

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

Với một trình trợ giúp đơn giản như vậy, hầu hết các trình biên dịch thậm chí sẽ bỏ ẩn hoàn toàn bản sao. – Agentlien

+2

Bằng cách này, theo tiêu chuẩn * hiện tại * lambda của bạn cần một '-> std :: vector ', tôi nghĩ vậy. –

+0

hmm bây giờ tôi đang bối rối. Đã thử với gcc4.7 và cl17.00 và cả hai đều chấp nhận nó, nhưng thực sự tôi dường như nhớ các phiên bản trước của cả hai sẽ từ chối nó. – stijn

0

đóng gói khởi tạo của bạn thành một chức năng và tuyên bố nó "constexpr" để bạn có thể sử dụng nó để khởi tạo một biểu thức const.

+3

Không cần một 'constexpr' ở đây, vì anh ta không cần một biểu thức hằng số biên dịch thời gian (mà một' std :: vector' return không bao giờ có thể, dù sao). –

0

Bạn có thể sử dụng std::transform cũng

vector<int> vec(10,1); 
transform(vec.begin(), vec.end(), vec.begin(), func); 

đâu func là:

int func(int i) 
{ 
//return a random generated number 
} 
+0

là có thể, nhưng OP yêu cầu một vector * const * đơn. – stijn

+0

@stijn Ohh có. Nhưng tôi có thể sử dụng một vector trung gian tạm thời và sau đó gán nó cho vector 'const' như cách tiếp cận của bạn đã tạo ra một trong hàm đang được gọi. – Saksham

Các vấn đề liên quan