[英]C++ strange class declaration
我正在練習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
在這一行:
s(0,0) = 1;
它被稱為:
double& operator()(int i, int m)
並且由於它返回對double的引用,因此您可以為其分配值。
第二行不再是初始化。 在第1行調用了構造函數,第二行調用了
double&運算符()(int i,int m)
其中n = 0和m = 0,並將1寫入返回的參考。
這部分:
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()
作為該數組的下標運算符。 我在上一個答案中張貼了一個做到這一點的課程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.