Вектори и итератори
Всеки контейнер от стандартната библиотека дефинира спомагателен тип iterator.
Обектите от типа iterator се използват за последователно обхождане на елементите на контейнера.
Итераторите могат да се разглеждат като “указатели” към елементите на контейнера.За всички итератори е дефиниран операторът ++, който премества итератора към следващия елемент от контейнера. Итераторите на някои контейнери поддържат и операцията --.
1. Деклариране
vector <Т>::iterator име;
Итератор към вектор от тип Т
обхождане от началото към края
Пример:
vector<int> v;
vector<int>::iterator it; //итератор към вектор от тип int
vector<Т>:: reverse_iterator
Итератор към вектор от тип Т
обхождане от края към началото
vector<int> v;
vector<double>:: reverse_iterator it; //итератор към вектор от тип double
2. Итератор към елемент на вектора
v.begin()
Връща итератор към първия елемент на вектора
v.begin()+i
Връща итератор, насочен към (i+1)-я елемент на вектора.
v. end()
Връща итератор, насочен след последния елемент на вектора
vector<int>::iterator it;
it = v.begin()+4;// насочваме итератора към 5ти елемент
3. Стойност на елемент сочен от итератор
*it
Връща стойността на елемента сочен от итератора it
Пример:
Обхождане на вектор и отпечатване съдържанието му на екрана:
vector<int> v1( 3, 5 );
- vector<int>::iterator it;
for( it = v1.begin(); it != v1.end(); it++ ) cout << *it<<" ";
cout << endl;
}
Реализация чрез функция:
void showvector(vector<int> &v)
{if (v.empty()) cout << "empty vector" << endl;
else{ vector<int>::iterator it;
for (it=v.begin(); it<v.end();it++ ) cout << " " << *it;
cout << endl;
}
}
Обхождане в обратен ред:
vector<int>::reverse_iterator it;
for(it=a.rbegin(); it!=a.rend();it++) cout<<*it<<" " ;
4. Добавяне на елемент на произволно място във вектор
v.insert( it ,value );
Вмъква елемент със стойност value преди елемента, сочен от итератора it.
v.insert(it_pos, count_n,value);
Вмъква count_n на брой елемента със стойност value преди елемента сочен от итератора it_pos.
Пример:
// създава вектор от три елементаИзход:
5 5 5 10 11 12
5 5 5 10 33 11 12
5 5 20 20 20 20 20 5 10 33 11 12
v.insert(it_pos, begin_it,end_it);
Преди елемента сочен от итератора it_pos, се вмъкват всички елементи от begin_it до end_it.
Връща итератор сочещ първият вмъкнат елемент
Пример:
vector<int> v1;
v1.push_back( 0 ); v1.push_back( 1 ); v1.push_back( 2 );
v1.push_back( 3 );
vector<int> v2;
v2.push_back( 5 ); v2.push_back( 6 );
v2.push_back( 7 ); v2.push_back( 8 );
cout << "Before, v2 is: ";
for( int i = 0; i < v2.size(); i++ ) cout << v2[i] << " ";
cout <<endl;
v2.insert( v2.end(), v1.begin(), v1.end() );
cout << "After, v2 is: ";
for( int i = 0; i < v2.size(); i++ ) cout << v2[i] << " ";
cout <<endl;
Програмата ще изведе:
Before, v2 is: 5 6 7 8 After, v2 is: 5 6 7 8 0 1 2 35. Изтриване на елемент сочен от итератор
v.erase(it);
Премахва елемента указван от it. Връща итератор към елемента след премахнатия
v.erase(it1 , it2);
Изтрива елементите от [ it1 , it2 ). Връща итератор към следващ елемент.
Връща итератор сочещ след последния изтрит елемент
Примери:
// изтриваме 6ти елемент
it = v.begin() + 5;
v.erase(it);
// изтриваме елементите от 3ти до 7ми включително
it = v.begin();
v.erase(it+2, it + 7);
Примерна програма за използването на итератори за обобщени алгоритми:
Алгоритъм за сортиране:
sort(<начален_итератор>,<итератор_след_края>);
Програмиране на приложение с използване на алгоритъма за сортиране:
#include <algorithm>
// създаване на вектора v
// запълване на вектора v
// прилагане на алгоритъм
sort (v.begin(), v.end() );
Пример2:
Програма, която намира броя на нечетните елементи
#include <iostream>#include <iostream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
using namespace std;
bool prosto (int n)
{
if(n==1) return 0;
for(int i=2; i<=sqrt(n); i++) if(n%i==0) return 0;
return 1;
}
void write(vector <int> v)
{
cout << "v contains:";
for (int i=0; i<v.size(); i++) cout << " " << v[i];
cout << "\n\n";
}
void read(vector <int> &v,int n)
{
srand(time(0));
for(int i=1; i<=n; i++)
{
int p=rand()%100+1;
v.push_back(p);
}
}
int main ()
{
cout<<"n=";
int n;
cin>>n;
vector<int> v;
//запълване на вектора със случайни числа
read(v,n);
write(v);
vector <int>::iterator it,it1=v.end();
// сортиране
sort(v.begin(),v.end());
write(v);
//max елемент
cout<<"max= "<<*max_element(v.begin(),v.end())<<endl;
//min елемент
cout<<"min= "<<*min_element(v.begin(),v.end())<<endl;
//намиране на броя на простите числа
cout<<"Broi prosti chisla: "<<count_if(v.begin(),v.end(),prosto)<<endl;
//изтриване на простите числа от вектора
it=remove_if(v.begin(), v.end(), prosto);
v.erase(it,v.end());
write(v);
return 0;
}
#include <iostream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
void read(vector <string> &v,int n)
{
for(int i=1; i<=n; i++)
{
string s;
getline(cin, s);
v.push_back(s);
}
}
bool palindrom(string s) {
string p = s;
reverse(s.begin(), s.end());
string snew = s;
if (p == s) return true;
else return false;
}
int brPalindromi(vector <string> v) {
int br = 0;
for (int i = 0; i < v.size(); i++) {
if (palindrom(v[i])) br++;cout<<v[i]<<endl;
}
return br;
}
int main ()
{
cout<<"n=";
int n;
cin>>n;
cin.ignore();//Игнорира знака Enter натиснат след въвеждане на n
vector <string> v;
read(v,n);
cout << count_if(v.begin(),v.end(),palindrom) << endl;
return 0;
}