簡體   English   中英

將迭代器解引用為std :: vector后,顯式調用值構造函數 <std::uniform_real_distribution<double> &gt;

[英]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.01.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM