7.  Вектори

  Използване на вектори за съхраняване на данни

* Векторът е множество от данни от един и същи вид и номерация на данните
-- дефиниция
vector<double> salaries(10);
-- използване
salaries[4] = 355;
-- номериране на индекси
salaries[0] - първи елемент
salaries[1] - втори елемент
salaries[2] - трети елемент
salaries[3] - четвърти елемент
...
salaries[9] - десети елемент



Индекси на вектори

* Граници на индексите - от 0 до размерността на вектора -1
* Член-функция за получаване на размерността на вектора
vector<double> salaries(10);
...
for (i = 0; i < salaries.size(); i++) оператор
* Член-функции за увеличаване и намаляване на размера на вектора
salaries.push_back(елемент);
salaries.pop_back();

Четат се заплати на служители и се чертае графика на заплатите:
#include "ccc_win.cpp"
int main()
{ vector<double> salaries;
  bool more = true;
  while (more)
  { double s = cwin.get_double("Please enter a salary, 0 to quit: ");
    if (s == 0) more = false;
    else salaries.push_back(s);
  }
  int i;
  double highest = salaries[0];
  for (i = 1; i < salaries.size(); i++)
     if (salaries[i] > highest) highest = salaries[i];

  cwin.coord(0, 0, highest, salaries.size());
  for (i = 0; i < salaries.size(); i++)
  {  Point left(0, i);
     Point right(salaries[i], i);
     Line bar(left, right);
     Message label(left, salaries[i]);
     cwin << bar << label;
  }
  return 0;
}



Векторите като параметри и стойности на функции

*  Средно аритметично на елементите на вектор:
#include <iostream>
#include <vector>
using namespace std;
 
double average(vector<double> v)
{  if (v.size() == 0) return 0;
   int i;
   double sum = 0;
   for (i = 0; i < v.size(); i++)  sum = sum + v[i];
   return sum / v.size();
}

int main()
vector<double> salaries(5);
   salaries[0] = 35000.0;
   salaries[1] = 63000.0;
   salaries[2] = 48000.0;
   salaries[3] = 78000.0;
   salaries[4] = 51500.0;

   double avgsal = average(salaries);
   cout << "The average salary is " << avgsal << "\n";
   return 0;
}

*  Промяна на стойностите на елементите на вектор:
#include <iostream>
#include <vector>
using namespace std;

void raise_salaries(vector<double>& s, double p)
{  int i;
   for (i = 0; i < s.size(); i++) s[i] = s[i] * (1 + p/100);
}

int main()
{  vector<double> salaries(5);
   salaries[0] = 35000.0;
   salaries[1] = 63000.0;
   salaries[2] = 48000.0;
   salaries[3] = 78000.0;
   salaries[4] = 51500.0;

   raise_salaries(salaries, 4.5);

   int i;
   for (i = 0; i < salaries.size(); i++)
      cout << salaries[i] << "\n";
   return 0;
}

* Функцията връща вектор - всички стойности, които попадат в определен интервал.
#include <iostream>
#include <vector>
using namespace std;

vector<double> between(vector<double> v, double low, double high)
{ vector<double> result;
  int i;
  for (i = 0; i < v.size(); i++)
  if (low <= v[i] and v[i] <= high) result.push_back(v[i]);
  return result;
}

int main()
{  vector<double> salaries(5);
   salaries[0] = 35000.0;
   salaries[1] = 63000.0;
   salaries[2] = 48000.0;
   salaries[3] = 78000.0;
   salaries[4] = 51500.0;

   vector<double> midrange_salaries
      = between(salaries, 45000.0, 65000.0);

   int i;
   for (i = 0; i < midrange_salaries.size(); i++)
      cout << midrange_salaries[i] << "\n";
   return 0;
}



Прости алгоритми за вектори: намиране на стойност, броене и др.

* Намиране на стойност:
#include <iostream>
#include <vector>
using namespace std;

int find_first_greater(vector<double> a, double t)
{  int i = 0;
   while (i < a.size())
   {  if (a[i] > t)   return i;
      else   i++;   }
   return -1;
}
 
int main()
{  vector<double> salaries(5);
   salaries[0] = 35000.0;
   salaries[1] = 63000.0;
   salaries[2] = 48000.0;
   salaries[3] = 78000.0;
   salaries[4] = 51500.0;

   int i = find_first_greater(salaries, 50000);

   if (i > 0)
   {  cout << "The first salary above 50000 is at index " << i
         << " and is " << salaries[i] << "\n";
   }
   return 0;
}

* Броене:
#include <iostream>
#include <vector>
using namespace std;

int count_greater(vector<double> a, double t)
{  int count = 0;
   int i;
   for (i = 0; i < a.size(); i++)
       if (a[i] > t)   count++;
   return count;
}

int main()
{  vector<double> salaries(5);
   salaries[0] = 35000.0;
   salaries[1] = 63000.0;
   salaries[2] = 48000.0;
   salaries[3] = 78000.0;
   salaries[4] = 51500.0;

   int count = count_greater(salaries, 50000);

   cout << count << " salaries are above 50000\n";
   return 0;
}

* Намиране на всички съответствия:
#include <iostream>
#include <vector>
using namespace std;
#include "ccc_empl.cpp"

vector<int> find_all_greater(vector<double> a, double t)
{  vector<int> pos;
   int i;
   for (i = 0; i < a.size(); i++)
   {  if (a[i] > t)  pos.push_back(i);   }
   return pos;
}

int main()
{  vector<double> salaries(5);
   salaries[0] = 35000.0;
   salaries[1] = 63000.0;
   salaries[2] = 48000.0;
   salaries[3] = 78000.0;
   salaries[4] = 51500.0;

   vector<int> matches = find_all_greater(salaries, 50000);

   int j;
   cout << "These are the salaries above 50000:\n";
   for (j = 0; j < matches.size(); j++)
      cout << salaries[matches[j]] << "\n";
   return 0;
}

* Отстраняване на елемент от вектор:
#include <iostream>
#include <string>
#include <vector>
using namespace std;

void erase(vector<string>& a, int pos)
{  int i;
   for (i = pos; i < a.size() - 1; i++) a[i] = a[i + 1];
   a.pop_back();
}

void print(vector<string> a)
{  int i;
   for (i = 0; i < a.size(); i++)
      cout << "[" << i << "] " << a[i] << "\n";
}

int main()
{  vector<string> staff(5);
   staff[0] = "Cracker, Carl";
   staff[1] = "Hacker, Harry";
   staff[2] = "Lam, Larry";
   staff[3] = "Reindeer, Rudolf";
   staff[4] = "Sandman, Susan";
   print(staff);

   int pos;
   cout << "Remove which element? ";
   cin >> pos;

   erase(staff, pos);
   print(staff);
   return 0;
}

* Вмъкване на елемент на вектор:
#include <iostream>
#include <string>
#include <vector>
using namespace std;

void insert(vector<string>& a, int pos, string s)
{  int last = a.size() - 1;
   a.push_back(a[last]);
   int i;
   for (i = last; i > pos; i--) a[i] = a[i - 1];
   a[pos] = s;
}

void print(vector<string> a)
{  int i;
   for (i = 0; i < a.size(); i++)
      cout << "[" << i << "] " << a[i] << "\n";
}

int main()
{  vector<string> staff(5);
   staff[0] = "Cracker, Carl";
   staff[1] = "Hacker, Harry";
   staff[2] = "Lam, Larry";
   staff[3] = "Reindeer, Rudolf";
   staff[4] = "Sandman, Susan";
   print(staff);

   int pos;
   cout << "Insert before which element? ";
   cin >> pos;

   insert(staff, pos, "New, Nina");
   print(staff);
   return 0;
}



Векторите като данни на обект

* Програма за чертаене на многоъгълници:
#include "ccc_win.cpp"

class Polygon
{
public:
   Polygon();
   void add_point(Point p);
   void plot() const;
private:
   vector<Point> corners;
};

Polygon::Polygon() {}

void Polygon::add_point(Point p) {  corners.push_back(p); }

void Polygon::plot() const
{  int i;
   int n = corners.size();
   for (i = 0; i < n; i++)
      cwin << Line(corners[i], corners[(i + 1) % n]);
}

int main()
{  Polygon triangle;
   triangle.add_point(Point(1, 1));
   triangle.add_point(Point(3, 4));
   triangle.add_point(Point(2, 6));
   triangle.plot();

   const double PI = 3.141592653589793;
   Polygon pentagon;
   int i;
   for (i = 0; i < 5; i++)
      pentagon.add_point(Point(cos(2 * PI * i / 5),
         sin(2 * PI * i / 5)));
   pentagon.plot();
   return 0;
}