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?
Trả lời
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;
}());
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
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
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
đó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.
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). –
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
}
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