[英]Initialize an N-sized std::vector with std::uniform_real_distribution<double>
[英]Explicit call to a value constructor after dereferencing an iterator to std::vector<std::uniform_real_distribution<double> >
std::vector<std::uniform_real_distribution<double> > distribution_pos(10);
for(auto it = distribution_pos.begin(); it != distribution_pos.end(); it++)
{
it->std::uniform_real_distribution<double>(0.0,1.0);
}
我本質上想聲明std::uniform_real_distribution<double>
對象的向量(大小10)。 然后,我想遍歷此向量並調用對象的值構造函數(每次循環都應更改0.0
和1.0
數字,但為簡潔起見,在此省略)。 上面的代碼似乎沒有滿足我的要求。 在已經聲明了distribution_pos
之后是否可以對值構造函數進行顯式調用?
不,您不能像std::vector
的構造函數默認構造值並將其推入,因此不能再次構造它們。
為了避免這種情況,不創建一個大小那么大的向量,而是reserve(10)
(不構造任何東西,只保留內存),然后可以emplace_back
這些值,這將使用給定的參數構造一個對象。
std::vector<std::uniform_real_distribution<double> > distribution_pos;
distribution_pos.reserve(10);
for (std::size_t i = 0; i < 10; ++i) {
distribution_pos.emplace_back(0.0, 1.0);
}
我想遍歷此向量並調用對象的值構造函數
該對象已經默認使用(0.0,1.0)構造,您不能再次調用該構造函數。 但是,您可以通過取消引用迭代器並為其分配分配新的分配:
*it = std::uniform_real_distribution<double>(0.0,1.0);
或使用基於范圍的for循環:
for(auto &dist : distribution_pos) {
dist = std::uniform_real_distribution<double>(0.0,1.0);
}
如果您確實想保留原始發行版(也許保留其內部狀態),則可以替換其參數對象:
for(auto &dist : distribution_pos) {
// get the current parameters
auto params = dist.param();
// create new and replace the old parameters
dist.param(
std::move(
std::uniform_real_distribution<double>::param_type(
params.a(), params.b()
)
)
);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.