Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 104

Автор Π”. БтСфСнс

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.22. РасчСт расстояния ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ

#include <cmath>

#include <iostream>


using namespace std;


template<class Iter_T, class Iter2_T>

double vectorDistance(Iter_T first, Iter_T last, Iter2_T first2) {

 double ret = 0.0;

 while (first != last) {

  double dist = (*first++) - (*first2++);

  ret += dist * dist;

 }

 return ret > 0.0 ? sqrt(ret) : 0.0;

}


int main() {

 int v1[] = { 1, 5 };

 int v2[] = { 4, 9 };

 cout << "distance between vectors (1,5) and (4,9) is ";

 cout << vectorDistance(v1, v1 + 2, v2) << endl;

}

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 11.22 Π²Ρ‹Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

distance between vectors (1,5) and (4,9) is 5

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.22 Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ прямоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ слСдуСт ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² стилС STL. Для расчСта расстояний ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ я ΠΌΠΎΠ³ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ inner_product, ΠΎΠ΄Π½Π°ΠΊΠΎ я Π½Π΅ стал ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Π½Π΅ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ услоТнило Π±Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.23 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ, примСняя Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ inner_product ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° <numeric>.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.23. РасчСт расстояния ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ inner_product

#include <numeric>

#include <cmath>

#include <iostream>

#include <functional>


using namespace std;


template<class Value_T>

struct DiffSquared {

 Value_T operator()(Value_T x, Value_T y) const {

  return (x - y) * (x - y);

 }

};


template<class Iter_T, class Iter2_T>

double vectorDistance(Iter_T first, Iter_T last, Iter2_T first2) {

 double ret = inner_product(first, last, first2, 0.0L,

  plus<double>(), DiffSquared<double>());

 return ret > 0.0 ? sqrt(ret) : 0.0;

}


int main() {

 int v1[] = { 1, 5 };

 int v2[] = { 4, 9 };

 cout << "distance between vectors (1,5) and (4,9) is ";

 cout << vectorDistance(v1, v1 + 2, v2) << endl;

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ inner_product() ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° для вашСй ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ вашСго компилятора, я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

11.13. РСализация ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° с шагом

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ смСТныС числовыС ряды ΠΈ трСбуСтся ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ n-ΠΌΡƒ элСмСнту.

РСшСниС

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 11.24 прСдставлСн Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ класс ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° с шагом.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.24. stride_iter.hpp

#ifndef STRIDE_ITER_HPP

#define STRIDE_ITER_HPP


#include <iterator>

#include <cassert>


template<class Iter_T>

class stride_iter {

public:


 // ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ typedef

 typedef typename std::iterator_traits<Iter_T>::value_type value_type;

 typedef typename std::iterator_traits<Iter_T>::reference reference;

 typedef typename std::iterator_traits<Iter_T>::difference_type

  difference_type;

 typedef typename std::iterator_traits<Iter_T>::pointer pointer;

 typedef std::random_access_iterator_tag iterator_category;

 typedef stride_iter self;


 // конструкторы

 stride_iter() : m(NULL), step(0) {};

 stride_iter(const self& x) : m(x.m), step(x.step) {}

 stride_iter(Iter_T x, difference_type n) : m(x), step(n) {}


 // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

 self& operator++() { m += step; return *this; }

 self operator++(int) { self tmp = *this; m += step; return tmp; }

 self& operator+=(difference_type x) { m += x * step; return *this; }

 self& operator--() { m -= step; return *this; }

 self operator--(int) { self tmp = *this; m -= step; return trap; }

 self& operator--(difference type x) { m -= x + step; return *this; }

 reference operator[](difference_type n) { return m[n * step]; }

 reference operator*() { return *m; }


 // друТСствСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

 friend bool operator==(const self& x, const self& y) {

  assert(x.step == y.step);

  return x.m == y.m;

 }

 friend bool operator!=(const self& x, const self& y) {

  assert(x.step == y.step);

  return x.m != y.m;

 }

 friend bool operator<(const self& x, const self& y) {

  assert(x.step == y.step);

  return x.m < y.m;

 }

 friend difference type operator-(const self& x, const self& y) {

  assert(x.step == y.step);

  return (x.m - y.m) / x.step;

 }

 friend self operator+(const self& x, difference_type y) {

  assert(x.step == y.step);

  return x += y * x.step;

 }

 friend self operator+(difference_type x, const self& y) {

  assert(x.step == y.step);

  return y += x * x.step;

 }

private:

 Iter_T m;

 difference_type step;

};


#endif

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.25 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ stride_iter ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 11.24 для получСния доступа ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ элСмСнту ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.25. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° stride_iter

#include "stride_iter.hpp"

#include <algorithm>

#include <iterator>

#include <iostream>


using namespace std;


int main() {

 int a[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

 stride_iter<int*> first(a, 2);

 stride_iter<int*> last(a + 8, 2);

 copy(first, last, ostream_iterator<int>(cout, "\n"));

}

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 11.25 Π²Ρ‹Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

0

2

4

6

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ с шагом часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ. Они ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ простой ΠΈ эффСктивный способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Π² Π²ΠΈΠ΄Π΅ Π½Π°Π±ΠΎΡ€Π° числовых рядов. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Π°Ρ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 11.24 рСализация ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° с шагом Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона.

Π― Ρ…ΠΎΡ‚Π΅Π» ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ с шагом совмСстимым с STL, поэтому ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ подходящий Ρ‚ΠΈΠΏ стандартного ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ трСбования. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 11.24 ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ с шагом сдСлан ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ доступом.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 11.26 я ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π» Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° с шагом (Π½Π°Π·Π²Π°Π½Π½ΡƒΡŽ kstride_iter), ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ шага извСстСн Π½Π° этапС компиляции. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ шага пСрСдаСтся ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона, компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π±ΠΎΠ»Π΅Π΅ эффСктивно, ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.26. kstride_iter.hpp

#ifndef KSTRIDE_ITER_HPP

#define KSTRIDE_ITER_HPP


#include <iterator>


template<class Iter_T, int Step_N>

class kstride_iter {

public:

 // ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ typedef

 typedef typename std::iterator_traits<Iter_T>::value_type value_type;

 typedef typename std::iterator_traits<Iter_T>::reference reference;

 typedef typename std::iterator_traits<Iter_T>::difference_type

  difference_type;

 typedef typename std::iterator_traits<Iter_T>::pointer pointer;

 typedef std::random_access_iterator_tag iterator_category;

 typedef kstride_iter self;


 // конструкторы

 kstride_iter() : m(NULL) {} kstride_iter(const self& x) : m(x.m) {}

 explicit kstride_iter(Iter_T x) : m(x) {}


 // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

 self& operator++() { m += Step_N; return *this; }

 self operator++(int) { self tmp = *this; m += Step_N; return tmp; }

 self& operator+=(difference_type x) { m += x * Step_N; return *this; }

 self& operator--() { m -= Step_N; return *this; }

 self operator--(int) { self tmp = *this; m -= Step_N; return tmp; }

 self& operator--(difference_type x) { m -= x * Step_N; return *this; }

 reference operator[](difference_type n) { return m[n * Step_N]; }

 reference operator*() { return *m; }


 // друТСствСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

 friend bool operator==(self x, self y) { return x.m == y.m; }

 friend bool operator!=(self x, self y) { return x.m != y.m; }

 friend bool operator<(self x, self y) { return x.m < y.m; }

 friend difference_type operator-(self x, self y) {

  return (x.m - y.m) / Step_N;

 }


 friend self operator+(self x, difference_type y) { return x += y * Step_N; }

 friend self operator+(difference_type x, self y) { return y += x * Step_N; }

private:

 Iter_T m;

};


#endif

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.27 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ kstride_iter.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.27. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° kstride_iter

#include "kstride_iter.hpp"

#include <algorithm>

#include <iterator>

#include <iostream>


using namespace std;


int main() {

 int a[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

 kstride_iter<int*, 2> first(a);

 kstride_iter<int*, 2> last(a + 8);

 copy(first, last, ostream_iterator<int>(cout, "\n"));

}

11.14. РСализация динамичСской ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

ВрСбуСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ числовыС ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, размСрности ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… (количСство строк ΠΈ столбцов) нСизвСстны Π½Π° этапС компиляции.

РСшСниС

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 11.28 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ ΠΈ эффСктивная рСализация класса динамичСской ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ с шагом ΠΈΠ· Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π° 11.12 ΠΈ valarray.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 11.28. matrix.hpp