我正在练习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;
}
答案 0 :(得分:6)
您正在混淆对state::operator()(int, int)
的初始化调用。该操作符调用允许您设置类实例的元素的值。
State s(n); // this is the only initialization
s(0,0) = 1; // this calls operator()(int, int) on instance s
答案 1 :(得分:0)
在这一行:
s(0,0) = 1;
它称之为:
double& operator()(int i, int m)
并且因为它返回对double的引用,您可以为其分配。
答案 2 :(得分:0)
第二行不再是初始化。构造函数在第1行调用,第二行调用
双&安培; operator()(int i,int m)
,n = 0且m = 0,并将1写入返回的引用。
答案 3 :(得分:0)
这部分:
State(int n) : _n(n), _p(2*n+1)
...是成员初始化列表。这有点像你编写的构造如下:
state(int n) { _n = n; _p = 2*n+1; }
...除了它初始化_n
和_p
而不是从它们开始单元化,然后为它们分配值。在这种特殊情况下可能没什么区别,但是当你有像只能被初始化(未分配)的引用之类的东西时,它变得至关重要。
s(0,0) = 1
看起来像s
的行为有点像2D数组,并且它们已经重载operator()
以充当该数组的下标运算符。我发布了一个在previous answer中执行此操作的课程。