Skip to content

Commit

Permalink
Merge branch 'master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
EzoeRyou authored Aug 5, 2019
2 parents b43e3c0 + 5b00fe9 commit 3b13ae1
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 53 deletions.
2 changes: 1 addition & 1 deletion 004-debug-compile-error.md
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ main.cpp:7:40: error: expected ‘;’ before ‘)’ token

これに当てはめると、問題はソースファイル`main.cpp`の7行目の40列目にある。

エラーメッセージは、「`';'``')'`がトークンの前にあるべき」だ。
エラーメッセージは、「`';'`がトークン`')'`の前にあるべき」だ。

トークン(token)というのは`'std'`とか`'::'`とか`'cout'`といったソースファイルの空白文字で区切られた最小の文字列の単位のことだ。

Expand Down
8 changes: 4 additions & 4 deletions 025-array-iterator.md
Original file line number Diff line number Diff line change
Expand Up @@ -423,10 +423,10 @@ struct array
return array_iterator( *this, 0 ) ;
}
// 末尾要素へのイテレーター
// 最後の次の要素へのイテレーター
iterator end()
{
return array_iterator( *this, N-1 ) ;
return array_iterator( *this, N ) ;
}
} ;
~~~
Expand Down Expand Up @@ -1043,13 +1043,13 @@ struct array
const_iterator begin() const
{ return const_iterator(*this, 0) ; }
const_iterator end() const
{ return const_iterator(*this, N-1) ; }
{ return const_iterator(*this, N) ; }

// 常にconst_iteratorを返す
const_iterator cbegin() const
{ return const_iterator(*this, 0) ; }
const_iterator cend() const
{ return const_iterator(*this, N-1) ; }
{ return const_iterator(*this, N) ; }

// その他のメンバー
} ;
Expand Down
4 changes: 2 additions & 2 deletions 033-vector-implementation.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,13 @@ int main()
// 構築
std::string * s = new(p) std::string("hello") ;
// 明示的なデストラクター呼び出し
s->basic_string() ;
s->~basic_string() ;
// メモリー解放
a.deallocate( p, 1 ) ;
}
~~~

このように書くのはとても面倒だ。特に`std::string`の明示的なデストラクター呼び出し`s->basic_string`が面倒だ。なぜ`s->string`ではだめなのか。
このように書くのはとても面倒だ。特に`std::string`の明示的なデストラクター呼び出し`s->~basic_string`が面倒だ。なぜ`s->~string`ではだめなのか。

実は`std::string`は以下のようなクラステンプレートになっている。

Expand Down
10 changes: 5 additions & 5 deletions 043-random.md
Original file line number Diff line number Diff line change
Expand Up @@ -647,7 +647,7 @@ void f( Engine & e )
}
~~~

浮動小数点数の難しいところは、整数と違って値の範囲の状態が多いことだ。例えば`0.0``1.0`の間には`0.5`もあるし、`0.01`もあるし`0.001`もある。浮動小数点数の実装が表現できる状態はとても多い。`uniform_real_distribution`は指定された値の範囲で浮動小数点数が表現できるすべての値のうちから乱数を生成してくれる。そのため読者は難しいことを考える必要はない。
浮動小数点数の難しいところは、整数と違って値の範囲の状態が多いことだ。例えば`0.0``1.0`の間には`0.5`もあるし、`0.01`もあるし`0.001`もある。浮動小数点数の実装が表現できる状態はとても多い。`uniform_real_distribution`は指定された値の範囲で浮動小数点数が表現できるすべての値のうちから乱数を生成してくれる。そのため読者は難しいことを考える必要はない。

## ベルヌーイ分布(Bernoulli distributions)

Expand Down Expand Up @@ -847,7 +847,7 @@ int main()
}
~~~

100回コイントスとした結果、表が出た回数を乱数で得る関数`coinflips100`は以下のように書ける。
100回コイントスをした結果、表が出た回数を乱数で得る関数`coinflips100`は以下のように書ける。

~~~cpp
template < typename Engine >
Expand Down Expand Up @@ -880,7 +880,7 @@ int main()

期待値は50なので、50前後の乱数が出やすい。

6面ダイスを60回振った結果出た1の目の合計を乱数で返す関数`'roll_for_one'`は以下のようになる。
6面ダイスを60回振った結果出た1の目の合計を乱数で返す関数`roll_for_one`は以下のようになる。

~~~cpp
template < typename Engine >
Expand Down Expand Up @@ -1105,7 +1105,7 @@ auto count_n_coinflips( unsigned int n, Engine & e )
}
~~~
6面ダイスを10回、1の目が出るまで振った回数を乱数で返す関数`"count_10_rolls"`は以下のとおり。
6面ダイスを10回、1の目が出るまで振った回数を乱数で返す関数`count_10_rolls`は以下のとおり。
~~~cpp
template < typename Engine >
Expand All @@ -1116,7 +1116,7 @@ auto count_10_rolls( Engine & e )
}
~~~

確率1%のくじを10回当てるまでくじを引いた回数を返す関数`count_10_lootbox`は以下のとおり。
確率1%のくじを10回当てるまでくじを引いた回数を返す関数`count_10_lootboxes`は以下のとおり。

~~~cpp
template < typename Engine >
Expand Down
12 changes: 6 additions & 6 deletions 046-random-part4.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ int roll_dice( Engine & e )
#### 数学的な説明
`std::piecewise_constant_distribution<RealType>`は浮動小数点数型の乱数$x$, $b_0 \leq x < b_n$を以下の確率密度関数に従って、それぞれの部分区間(subinterval)$[b_i, b_{i+1}$の間で一様に分布させる。
`std::piecewise_constant_distribution<RealType>`は浮動小数点数型の乱数$x$, $b_0 \leq x < b_n$を以下の確率密度関数に従って、それぞれの部分区間(subinterval)$[b_i, b_{i+1})$の間で一様に分布させる。
$$
p(x \,|\, b_0, \dotsc, b_n, \; \rho_0, \dotsc, \rho_{n-1}) = \rho_i
Expand Down Expand Up @@ -290,7 +290,7 @@ int main()
}
~~~

この場合、区間は`[1.0, 2.0)`, `[2.0, 3.0)`, '[3.0, 4.0)', '[4.0, 5.0)'の4個になり、確率は`{1.5, 2.5, 3.5, 4.5}`となる。
この場合、区間は`[1.0, 2.0)`, `[2.0, 3.0)`, `[3.0, 4.0)`, `[4.0, 5.0)`の4個になり、確率は`{1.5, 2.5, 3.5, 4.5}`となる。

##### 区間数、最小、最大、関数オブジェクトによる指定

Expand Down Expand Up @@ -338,7 +338,7 @@ public :
} ;
~~~
`intervals`は区間、densitiesは確率を返す
`intervals`は区間、`densities`は確率を返す
~~~cpp
int main()
Expand Down Expand Up @@ -367,7 +367,7 @@ int main()

区分線形分布における確率は、区間に対してではなく、内部境界に対して指定する。指定した全区間における値の出現確率は、内部境界から内部境界に向かって指定した確率の差の方向に線形に増加、もしくは減少する。

例えば区分`{0.0, 1.0}`と確率`{1.0, 2.0}`を指定した場合、これはひとつの区間`[0.0, 1.0)`について、内部境界`0.0`の確率は$\frac{1}{3}$、内部境界`1.0'の確率は`\frac{2}{3}`とし、$0.0 \leq x < 1.0$の範囲の乱数`x`を生成する。内部境界区間の範囲に注意。`1.0`未満なので`1.0`は出ない。
例えば区分`{0.0, 1.0}`と確率`{1.0, 2.0}`を指定した場合、これはひとつの区間`[0.0, 1.0)`について、内部境界`0.0`の確率は$\frac{1}{3}$、内部境界`1.0`の確率は`\frac{2}{3}`とし、$0.0 \leq x < 1.0$の範囲の乱数`x`を生成する。内部境界区間の範囲に注意。`1.0`未満なので`1.0`は出ない。

そして、区間の間の値は、区間を区切る2つの内部境界の確率の差によって、線形に増加、もしくは減少する。例えば値`0.25`が出る確率は$\frac{1.25}{3}$、`0.5`が出る確率は$\frac{1.5}{3}$、値`1.75`がでる確率は$\frac{1.75}{3}$だ。

Expand Down Expand Up @@ -422,9 +422,9 @@ piecewise_linear_distribution(
InputIteratorW firstW );
~~~
`[firstB, lastB)`は区間、`firstW`から区間数までのイテレーターが確立
`[firstB, lastB)`は区間、`firstW`から区間数までのイテレーターが確率
`firstB == lastB`もしくは`+firstB == lastB`の場合、つまり内部境界が1個以下で、空の場合、区間数はひとつで`[0.0, 1.0)`の範囲、確率は`{0.0, 1.0}`となる。
`firstB == lastB`もしくは`++firstB == lastB`の場合、つまり内部境界が1個以下で、空の場合、区間数はひとつで`[0.0, 1.0)`の範囲、確率は`{0.0, 1.0}`となる。
##### 使い方
Expand Down
2 changes: 1 addition & 1 deletion 200-cpp.md
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,7 @@ FOO

### プリプロセッサーの定数式

プリプロセッサーで使える条件式は、C++の条件式とは比べてだいぶ制限がある。基本的には整数定数式で、`true`, `false`が使えるほか、`123`, `1+1`, `1 == 1`, `1 < 1`のような式も使える。ただし、識別子はすべてマクロ名として置換できるものは置換され、置換できない識別子は、`true`, `false`以外はキーワードも含めてすべて`0`に置換される。
プリプロセッサーで使える条件式は、C++の条件式と比べてだいぶ制限がある。基本的には整数定数式で、`true`, `false`が使えるほか、`123`, `1+1`, `1 == 1`, `1 < 1`のような式も使える。ただし、識別子はすべてマクロ名として置換できるものは置換され、置換できない識別子は、`true`, `false`以外はキーワードも含めてすべて`0`に置換される。

したがって、プリプロセッサーで以下のように書くと、

Expand Down
10 changes: 5 additions & 5 deletions 300-multiple-source-files.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ C++のソースファイルをコンパイルして実行可能ファイルを
`source.cpp`という名前のソースファイルがあるとき、ここから`program`という名前の実行可能ファイルを作るには、

~~~
$ g++ -o program source.file
$ g++ -o program source.cpp
~~~

としていた。毎回このコマンドを入力するのは面倒なので、`Makefile`を以下のように書いていた。
Expand Down Expand Up @@ -283,7 +283,7 @@ void f( double ) { }
名前は使う前に宣言が必要だが、肝心の定義は別のソースファイルに書いてある。宣言と定義を間違えてしまった場合はエラーになる。
~~~cpp
// print_int.hpp
// print_int.cpp
// 失敗状態を返す
bool print_int( int x )
{
Expand Down Expand Up @@ -404,7 +404,7 @@ void print_int( int x )
void print_int( int x ) ;
// library.cpp
std::string delimiter ;
std::string delimiter{"\n"} ;
void print_int( int x )
{ std::cout << x << delimiter ; }
Expand Down Expand Up @@ -492,7 +492,7 @@ ODRの例外的な回避の怖いところは、間違えてしまってもコ

~~~c++
// 宣言
strut Foo ;
struct Foo ;

// 定義
struct Foo
Expand Down Expand Up @@ -615,7 +615,7 @@ struct S
} ;
~~~

`static`メンバー関数はクラスのオブジェクトには依存していない。そのため、クラスのオブジェクトなしで呼び出すことができる
`static`メンバー関数はクラスのオブジェクトには依存していない。そのため、クラスのオブジェクトなしで呼び出すことができる

~~~cpp
struct S
Expand Down
Loading

0 comments on commit 3b13ae1

Please sign in to comment.