gpt4 book ai didi

c++ - 如何从可变数据创建 std::initializer_list

转载 作者:行者123 更新时间:2023-11-30 02:55:33 24 4
gpt4 key购买 nike

我正在尝试使用传递到类构造函数中的数据创建一个 std::discrete_distribution 对象。我知道如何使用静态数据创建它,但无法弄清楚如何(干净地)使用可变数据。我现在所拥有的“有效”,但很痛苦。有更合适的方法吗?

distInit = { distArray[0], ... }; 行是问题所在。

#include <iostream>
#include <iomanip>
#include <initializer_list>
#include <map>
#include <random>

class Die {
private:
int loadSide;
double loadAmount;
std::mt19937 generator;
std::discrete_distribution<> distribution;
std::initializer_list<double> distInit;
std::array<double, 7> distArray;
public:
Die( int loadSide, double loadAmount ) : loadSide(loadSide), loadAmount(loadAmount) {
distArray.fill( 1 );
distArray[0] = 0;
distArray[this->loadSide] = this->loadAmount;

distInit = { distArray[0], distArray[1], distArray[2], distArray[3], distArray[4], distArray[5], distArray[6] };
distribution.param( distInit );
};
int roll( ) {
return distribution( generator );
};
};

const int ROUNDS = 10000;

int main() {
Die* die = new Die( 5, 20 );

std::map<int, int> m;
for(int n=0; n < ROUNDS; n++) {
m[die->roll()]++;
}
for(auto p : m) {
std::cout << p.first << " generated " << std::setiosflags(std::ios::fixed) << std::setprecision(2) << (float) p.second / ROUNDS << " times\n";
}
}

我可能没有问正确的问题,如果是这样,我会提前道歉。这是一个很大的可能性,因为我很惊讶我找不到任何(显然)与这个主题相关的命中。

我的编译器是g++-mp-4.8 (MacPorts gcc48 4.8-20130411_0) 4.8.1 20130411 (prerelease)

命令行 /opt/local/bin/g++-mp-4.8 -std=c++11 test.cpp -o test

最佳答案

如果你有可变数据,你应该使用 discrete_distribution constructor taking a pair of iterators :

template< class InputIt >
discrete_distribution( InputIt first, InputIt last );

您不应该尝试直接构建param_type;而是使用辅助函数来构造您的分布:

class Die {
private:
std::mt19937 generator;
std::discrete_distribution<> distribution;
static std::discrete_distribution<> makeDistribution(
int loadSide, double loadAmount )
{
std::array<double, 7> distArray;
distArray.fill( 1 );
distArray[0] = 0;
distArray[loadSide] = loadAmount;
return {std::begin(distArray), std::end(distArray)};
}
public:
Die( int loadSide, double loadAmount ) :
generator{ },
distribution{ makeDistribution( loadSide, loadAmount ) }
{}
int roll( ) {
return distribution( generator );
}
};

关于c++ - 如何从可变数据创建 std::initializer_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16349006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com