Индекси на вектори
* Граници на индексите - от 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;
}
Дефиниране и използване на масиви,
масивите като параметри
* Дефиниране и използване:
-- дефиниция
double salaries[10];
-- използване
salaries[4] = 355;
-- номериране на индекси
salaries[0] -
първи елемент
salaries[1] -
втори елемент
salaries[2] -
трети елемент
salaries[3] -
четвърти елемент
...
salaries[9] -
десети елемент
* Mасивите като параметри на функции
double maximum(const double a[], int a_size)
{ if (a_size == 0) return 0;
double highest = a[0];
int i;
for (i = 1; i < a_size;
i++)
if (a[i]
> highest)highest = a[i];
return highest;
}
Двумерни масиви
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
const int BALANCES_ROWS = 11;
const int BALANCES_COLS = 6;
double future_value(double initial_balance,
double p, int nyear)
{ double b = initial_balance * pow(1
+ p/12/100, 12*nyear);
return b; }
void print_table(const double table[][BALANCES_COLS],
int table_rows)
{ int i, j;
cout << fixed <<
setprecision(2);
for (i = 0; i < table_rows;
i++)
{ for (j = 0; j <
BALANCES_COLS; j++)
cout << setw(10) << table[i][j];
cout <<
"\n";
}
}
int main()
{ double balances[BALANCES_ROWS][BALANCES_COLS];
int i;
int j;
for (i = 0; i < BALANCES_ROWS;
i++)
for (j
= 0; j < BALANCES_COLS; j++)
balances[i][j] = future_value(10000, 5 + i * 0.5,
5 + j * 5);
print_table(balances, BALANCES_ROWS);
return 0;
}