gpt4 book ai didi

C++ 奇怪的类声明

转载 作者:行者123 更新时间:2023-11-30 00:53:51 25 4
gpt4 key购买 nike

我正在练习 ACM 问题以成为更好的程序员,但我对 C++ 还是相当陌生,而且我在解释我正在阅读的一些评委代码时遇到了问题。类的开头以

开头
public:
State(int n) : _n(n), _p(2*n+1)
{

然后它被初始化为

State s(n);
s(0,0) = 1;

我正在尝试阅读代码,但我无法理解其中的含义。 State 类似乎只传递了 1 个参数,但程序员在初始化时传递了 2 个参数。另外,究竟什么被设置为= 1?据我所知,= 运算符没有被重载,但为了防止我遗漏了什么,我在下面包含了完整的代码。

如有任何帮助,我们将不胜感激。

提前致谢

    /*
* D - Maximum Random Walk solution
* ICPC 2012 Greater NY Regional
* Solution by Adam Florence
* Problem by Adam Florence
*/

#include <cstdio> // for printf
#include <cstdlib> // for exit
#include <algorithm> // for max
#include <iostream>
#include <vector>

using namespace std;

class State
{
public:
State(int n) : _n(n), _p(2*n+1)
{
if (n < 1)
{
cout << "Ctor error, n = " << n << endl;
exit(1);
}
for (int i = -n; i <= n; ++i)
_p.at(i+_n) = vector<double>(n+1, 0.0);
}

void zero(const int n)
{
for (int i = -n; i < n; ++i)
for (int m = 0; m <= n; ++m)
_p[i+_n][m] = 0;
}

double operator()(int i, int m) const
{
#ifdef DEBUG
if ((i < -_n) || (i > _n))
{
cout << "Out of range error, i = " << i << ", n = " << _n << endl;
exit(1);
}
if ((m < 0) || (m > _n))
{
cout << "Out of range error, m = " << m << ", n = " << _n << endl;
exit(1);
}
#endif
return _p[i+_n][m];
}

double& operator()(int i, int m)
{
#ifdef DEBUG
if ((i < -_n) || (i > _n))
{
cout << "Out of range error, i = " << i << ", n = " << _n << endl;
exit(1);
}
if ((m < 0) || (m > _n))
{
cout << "Out of range error, m = " << m << ", n = " << _n << endl;
exit(1);
}
#endif
return _p[i+_n][m];
}

static int min(int x, int y)
{
return(x < y ? x : y);
}
static int max(int x, int y)
{
return(x > y ? x : y);
}

private:
int _n;

// First index is the current position, from -n to n.
// Second index is the maximum position so far, from 0 to n.
// Value is probability.
vector< vector<double> > _p;
};

void go(int ds)
{
// Read n, l, r
int n, nds;
double l, r;
cin >> nds >> n >> l >> r;
const double c = 1 - l - r;

if(nds != ds){
cout << "Dataset number " << nds << " does not match " << ds << endl;
return;
}

// Initialize state, probability 1 at (0,0)
State s(n);
s(0,0) = 1;

State t(n);

State* p1 = &s;
State* p2 = &t;

for (int k = 1; k <= n; ++k)
{
// Compute probabilities at step k

p2->zero(k);

// At step k, the farthest from the origin you can be is k
for (int i = -k; i <= k; ++i)
{
const int mm = State::min( State::max(0, i+k), k);
for (int m = 0; m <= mm; ++m)
{
// At step k-1, p = probability of (i,m)
const double p = p1->operator()(i,m);
if (p > 0)
{
// Step left
p2->operator()(i-1, m) += p*l;
// Step right
p2->operator()(i+1, State::max(i+1,m)) += p*r;
// Stay put
p2->operator()(i, m) += p*c;
}
}
}
swap(p1, p2);
}

// Compute expected maximum position
double p = 0;
for (int i = -n; i <= n; ++i)
for (int m = 0; m <= n; ++m)
p += m * p1->operator()(i,m);

printf("%d %0.4f\n", ds, p);
}

int main(int argc, char* argv[])
{
// Read number of data sets to process
int num;
cin >> num;

// Process each data set identically
for (int i = 1; i <= num; ++i)
go(i);

// We're done
return 0;
}

最佳答案

您混淆了对 state::operator()(int, int) 的调用和初始化。该运算符调用允许您设置类实例的元素的值。

State s(n);  // this is the only initialization
s(0,0) = 1; // this calls operator()(int, int) on instance s

关于C++ 奇怪的类声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15363595/

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