我有一個非常簡單的類,它有一個 x、y 和 z 值。像這樣:
class Individual
{
public:
static std::unique_ptr<Individual> Spawn(std::mt19937& rng);
Individual(double x, double y)
:
x(x),
y(y)
{
SetZ();
}
double GetZ() const
{
return z;
}
private:
void SetZ()
{
z = x * 0.123f y * 0.912f;
}
private:
double x = 0.0f;
double y = 0.0f;
double z = 0.0f;
};
Spawn 方法只是為 x 和 y 生成隨機值并生成一個個體:
std::unique_ptr<Individual> Individual::Spawn(std::mt19937& rng)
{
std::uniform_real_distribution<double> dist(-10.0f, 10.0f);
return std::make_unique<Individual>(dist(rng), dist(rng));
}
問題是在 main.cpp 我有這些人的向量,我試圖通過std::generate_n用 10 個隨機人填充它:
std::mt19937 rng = std::mt19937(std::random_device{}());
std::vector<std::unique_ptr<Individual>> individuals;
std::generate_n(individuals.begin(), 10,
Individual::Spawn(rng));
但是我收到一個錯誤:錯誤 C2064:術語不評估為采用 0 個引數的函式。
是什么賦予了?我究竟做錯了什么?任何幫助/批評表示贊賞
uj5u.com熱心網友回復:
generate_n()的最后一個引數是一個函式,而不是一個值。該函式將被呼叫n一次,每個元素生成一次。你給它一個std::unique_ptr. Spawn(rng)而是將您的呼叫包裝在 lambda 運算式中。
此外,std::generate_n()需要一個迭代器到一個范圍的開頭,該范圍的大小至少為n元素。它不(它不能)使用該迭代器來插入新元素,非成員演算法永遠不能用迭代器做到這一點。一種解決方案是包裝容器std::back_inserter以創建一個輸出迭代器,該迭代器將根據需要擴展容器。或者,您可以resize()在n呼叫std::generate_n().
您的功能的正確實作是:
std::mt19937 rng = std::mt19937(std::random_device{}());
std::vector<std::unique_ptr<Individual>> individuals;
std::generate_n(
std::back_inserter(individuals),
10,
[&rng](){ return Individual::Spawn(rng); });
現場演示:https ://godbolt.org/z/756Ejscvd
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/520998.html
標籤:C c 11stl
