ΠΠ½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ·ΠΎΡΡΠ΅Π½Π½ΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ rand ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°Π½Π½Π°Ρ ΠΠΆΠ΅Π½Π·ΠΎΠΌ ΠΠ°ΡΡΠ΅ΡΠΎΠΌ (Jens Maurer) Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Boost Random; ΠΎΠ½Π° Π±ΡΠ»Π° ΠΈΠ½ΡΠΏΠΈΡΠΈΡΠΎΠ²Π°Π½Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ ΠΏΠΎ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠΈΡΠ΅Π», ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌΠΈ Π² TR1.
TR1 ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Β«Technical Report OneΒ» ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ ΠΏΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ C++98.
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Boost Random ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΡΠΎΠΊΠΎΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΠΎ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠΈΡΠ΅Π» ΠΊΠ°ΠΊ Π΄Π»Ρ ΡΠ΅Π»ΡΡ ΡΠΈΠΏΠΎΠ², ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ ΡΠΈΠΏΠΎΠ² Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ, ΠΏΡΠΈΡΠ΅ΠΌ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ. ΠΡΠΈΠΌΠ΅Ρ 11.12 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΡΠΈΡΠ»Π° Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ Π² ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ [0,1).
ΠΡΠΈΠΌΠ΅Ρ 11.12. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Boost Random
#include <boost/random.hpp>
#include <iostream>
#include <cstdlib>
using namespace std;
using namespace boost;
typedef boost::mt19937 BaseGenerator;
typedef boost::uniform_real<double> Distribution;
typedef boost::variate_generator<BaseGenerator, Distribution> Generator;
double boostDoubleRand() {
static BaseGenerator base;
static Distribution dist;
static Generator rng(base, dist);
return rng();
}
int main() {
cout << "expect 5 numbers within the interval [0.1)" << endl;
for (int i=0; i < 5; i++) {
cout << boostDoubleRand() << "\n";
}
cout << endl;
}
ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Boost Random Π² ΡΠΎΠΌ, ΡΡΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠ΅Π²Π΄ΠΎΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠΈΡΠ΅Π» ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ, Π·Π°Π²ΠΈΡΡΡΠΈΡ ΠΎΡ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°. Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 11.12 Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Mersenne Twister (mt19937), ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ Π΄Π°Π΅Ρ Ρ ΠΎΡΠΎΡΠ΅Π΅ ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠΈΡΠ΅Π».
11.7. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ
Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ generate ΠΈ generate_n ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° <algorithm> ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ ΡΡΠ½ΠΊΡΠΎΡΠΎΠΌ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠΈΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΡΠΈΡΠ»Π°. ΠΡΠΈΠΌΠ΅Ρ 11.13 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ 11.13. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ
#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream>
#include <cstdlib>
using namespace std;
struct RndIntGen {
RndIntGen(int l, int h) : low(l), high(h) {}
int operator()() const {
return low + (rand() % ((high - low) + 1));
}
private:
int low;
int high;
};
int main() {
srand(static_cast<unsigned int>(clock()));
vector<mt> v(5);
generate(v.begin(), v.end(), RndIntGen(1, 6));
copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\n"));
}
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ° 11.13 Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠ΄Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ.
3
1
2
6
4
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° C++ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ generate ΠΈ generate_n, ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠΈΡΠ΅Π». ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π½ΡΠ»Ρ-Π°ΡΠ½ΡΠΉ ΡΡΠ½ΠΊΡΠΎΡ (ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ-ΡΡΠ½ΠΊΡΠΈΡ Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²), ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΡΠ΅Π΄Π½ΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ generate ΠΈ generate_n ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 11.14.
ΠΡΠΈΠΌΠ΅Ρ 11.14. ΠΡΠΈΠΌΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ generate ΠΈ generate_n
template<class Iter_T, class Fxn_T>
void generate(Iter_T first, Iter_T last, Fxn_T f) {
while (first != last) *first++ = f();
}
template<class Iter_T, class Fxn_T>
void generate_n(Iter_T first, int n, Fxn_T f) {
for (int i=0; i < n; ++i) *first++ = f();
}
11.8. ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°
Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ Π΄Π»Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΡΠΈΡΠ»ΠΎΠ²ΡΠΌΠΈ Π²Π΅ΠΊΡΠΎΡΠ°ΠΌΠΈ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½ valarray ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° <valarray>. ΠΡΠΈΠΌΠ΅Ρ 11.15 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½ valarray.
ΠΡΠΈΠΌΠ΅Ρ 11.15. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° valarray
#include <valarray>
#include <iostream>
using namespace std;
int main() {
valarray<int> v(3);
v[0] = 1;
v[1] = 2;
v[2] = 3;
cout << v[0] << ", " << v[1] << ", " << v[2] << endl;
v = v + v;
cout << v[0] << ", " << v[1] << ", " << v[2] << endl;
v /= 2;
cout << v[0] << ", " << v[1] << ", " << v[2] << endl;
}
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ° 11.15 Π²ΡΠ΄Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ.
1, 2, 3
2, 4, 6
1, 2, 3
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΠΎΠΏΡΠ΅ΠΊΠΈ ΡΠ²ΠΎΠ΅ΠΌΡ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠΈΠΏ vector Π½Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°, Π΄Π»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π±Π»ΠΎΠ½ valarray. ΠΡΠΎΡ ΡΠ°Π±Π»ΠΎΠ½ Π½Π°ΠΏΠΈΡΠ°Π½ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ Π‘++, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π½Π° Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½Π°Ρ , ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΊ Π½Π΅ΠΌΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ Π²Π΅ΠΊΡΠΎΡΠ½ΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ. ΠΡΡΠ³ΠΎΠ΅ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ valarray ΡΠΎΡΡΠΎΠΈΡ Π² Π½Π°Π»ΠΈΡΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ΅Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ², ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΈΡΠ»ΠΎΠ²ΡΠΌΠΈ Π²Π΅ΠΊΡΠΎΡΠ°ΠΌΠΈ. ΠΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΊΠ°ΠΊ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠ΅ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅ΠΊΡΠΎΡΠΎΠ².
Π¨Π°Π±Π»ΠΎΠ½ valarray ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°Ρ , ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ Ρ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌΠΈ Π² C-ΡΡΠΈΠ»Π΅. ΠΡΠΈΠΌΠ΅Ρ 11.16 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΡ, ΡΡΡΠ»Π°ΡΡΠΈΠ΅ΡΡ Π½Π° Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ valarray ΠΈ Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ.
ΠΡΠΈΠΌΠ΅Ρ 11.16. ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π΄Π»Ρ valarray
template<class T>
T* valarray_begin(valarray<T>& x) {
return &x[0];
}
template<class T> T* valarray_end(valarray<T>& x) {
return valarray_begin(x) + x.size();
}
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΡΠ½ΡΠΉ Π²ΠΈΠ΄ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°, Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΡΠ°ΡΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠ½ΡΠ° valarray, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ &x[Ρ .size()]. ΠΡΠ»ΠΈ ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ valarray, Π²ΡΡ ΠΎΠ΄ΡΡΠ°Ρ Π·Π° Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΡΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎΠΌΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ.
ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ Π² valarray ΡΡΠ½ΠΊΡΠΈΠΉ-ΡΠ»Π΅Π½ΠΎΠ² begin ΠΈ end, Π½Π΅ΡΠΎΠΌΠ½Π΅Π½Π½ΠΎ, ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΡ ΡΡΠΈΠ»Ρ STL. ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π΅Ρ ΡΠΎ, ΡΡΠΎ Π² valarray ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ, ΠΎΡΠ»ΠΈΡΠ½Π°Ρ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° STL. ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΡΠΎ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ valarray Π² Π»ΡΠ±ΠΎΠΌ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΠΎΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ΅, Π³Π΄Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΎΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ.
11.9. ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ° ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°
Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΠΌΠ΅ΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΡΠ»ΠΎΠ²ΡΡ Π²Π΅ΠΊΡΠΎΡΠΎΠ² ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°.
Π Π΅ΡΠ΅Π½ΠΈΠ΅Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΡΠ°ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ valarray Π΄Π°Π΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Π΅ΠΊΡΠΎΡΠ°, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΡΠΈΠΌΠ΅Ρ 11.17 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½ Π²Π΅ΠΊΡΠΎΡΠ° ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, Π½Π°Π·Π²Π°Π½Π½ΡΠΉ Π·Π΄Π΅ΡΡ kvector.
ΠΡΠΈΠΌΠ΅Ρ 11.17. kvector.hpp
#include <algorithm>
#include <cassert>
template<class Value_T, unsigned int N>
class kvector {
public:
// ΠΎΡΠΊΡΡΡΡΠ΅ ΠΏΠΎΠ»Ρ
Value_T m[N];
// ΠΎΡΠΊΡΡΡΡΠ΅ ΠΈΠΌΠ΅Π½Π°, Π²Π²ΠΎΠ΄ΠΈΠΌΡΠ΅ typedef
typedef Value_T value_type;
typedef Value_T* iterator;
typedef const Value_T* const_iterator;
typedef Value_T& reference;
typedef const Value_T& const_reference;
typedef size_t size_type;
// ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡΠΎΡΠΊΠΎΠ³ΠΎ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠ° Π΄Π»Ρ kvector
typedef kvector self;
// ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Ρ
template<typename Iter_T>
void copy(Iter_T first, Iter_T last) {
copy(first, last, begin());
}
iterator begin() { return m; }
iterator end() { return m + N; }
const_iterator begin() const { return m; }
const_iterator end() const { return m + N; }
reference operator[](size_type n) { return m[n]; }
const_reference operator[](size_type n) const { return m[n]; }
static size_type size() { return N; }
// Π²Π΅ΠΊΡΠΎΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
self& operator+=(const self& x) {
for (int i=0; i<N; ++i) m[i] += x.m[i];
return *this;
}
self& operator-=(const self& x) {
for (int i=0; i<N; ++i) m[i] -= x.m[i];
return *this;
}
// ΡΠΊΠ°Π»ΡΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
self& operator=(value_type x) {
std::fill(begin(), end(), x);
return *this;
}
self& operator+=(value_type x) {
for (int i=0; i<N; ++i) m[i] += x;
return *this;
}