Контејнери, итератори, алгоритми

Стандардната библиотека на шаблони (STL - Standard Template Library) претставува множество од структури и алгоритми кои може да вршат операции над различни типови на податоци.

Контејнерите претставуваат структури на податоци во кои може да се чуваат разни информации. Сите контејнери кои се дел од Стандардната библиотека на шаблони се имплементирани како параметаризирани структури. Ова значи дека еден контејнер може да служи за чување на податоци од кој било тип (int, float, double, string, vector<int>, vector<float>, vector<vector<float> >, итн). 
Контејнер во C++ е објект кој се користи за складирање на збирки на други објекти. Тие се имплементирани како шаблони за класи што значи дека овие контејнери може да складираат било кој тип на податоци
За да може да користиме контејнер вектор, потребно е да ја вклучиме датотеката во која е тој дефиниран - наредба #include <vector>.

   

Секвенцијален контејнер во C++ е подредена колекција од ист тип на податоци во која секој елемент е зачуван на одредена позиција. Положбата на елементот зависи од местото и времето на вметнување на тој елемент.
Асоцијативни контејнери се оние контејнери во кои локацијата на елементот зависи од вредноста на елементот. Редоследот на вметнување на елементите не се зема предвид при определувањето на положбата на елементот. До елементите на асоцијативниот контејнер се пристапува преку клучеви, наречени и клучеви за пребарување
Aдаптивни (неограничени) контејнери (стек и ред, неподредено множество, неподредена мапа) овде не е важна ни позицијата на елементот, ни редоследот на внесување ниту пак вредноста на елементот. Важно е само нивното постоење во контејнерот. Ако се стават четири елементи, нивниот редослед не е дефиниран и може да се смени било кога
 
Итераторите претставуваат еден вид покажувачи кон елементите од контејнерите. Итераторите се користат за движење низ елементите од еден контејнер, како и за означување на делови од податоци врз кои сакаме да вршиме операции. 

Алгоритмите служат за вршење на операции врз податоци (подредување, пронаоѓање на најголема вредност, итн.). Потребно е вклучување на соодветната датотека во која е дефинирана функцијата која ќе се користи (#include <algorithm>)

Контејнери 

Вектори 

Векторите во C ++ се динамички низи што се користат за складирање на податоци. За разлика од низите, кои се користат за складирање на последователни податоци и имаат статична природа, векторите обезбедуваат поголема флексибилност на програмата - можат автоматски да ја менуваат големината кога некој елемент се вметнува или брише.

Синтакса

vector< object_type > variable_name;

Задолжително е да се одреди типот и името на променливата. 
Пример vector <int > a;
За да може да користиме вектор, потребно е да вклучиме со директивата  #include <vector>

Методи

push_back
- додавање елемент на крај на вектор
a.push_back(13);
ime_na_ vector .size - одредување големина на вектор / број на елементи
vector < int > b={10,20,30,40,50};
cout << "Vektorot ima " << b.size() << " elemenati" << endl;
ime_na_ vector .front - прв елемент на вектор vector < int > grupa={"Mira","Pero","Goran","Natasa"};
cout << "Prv vo grupata e " << grupa.front() << endl;
output: Mira
ime_na_ vector .back - пoследен елемент на вектор 
vector < int > grupa={"Mira","Pero","Goran","Natasa"};
cout << "Posleden vo grupata e " << grupa.back() << endl;
output: Natasa
ime_na_ vector .pop_back
- бришење на последниот елемент во векторот 
vector < double > temperature={23.2 , 25.8 , 11, 15.3, 17};
temperature.pop_back();
output:23.2, 25.8, 11, 15.3
ime_na_ vector .erase - бришење на елемент на одредена позиција во векторот 
vector < int > c={2,3,4};
c.erase(c.begin() + 1); //go brise elementot na pozicija 1 vo vektorot
ime_na_ vector .clear - бришење на сите елементи 
vector < int > c={2,3,4};
c.clear();//brisenje na site elementi vo vektorot, posle ova toj e prazen


Собирање на елементите на два вектори 
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
 vector<int> v,v1,v2;
 int x,n,i;
 cout<<"vnesi broj na elementi na vektorite ";
 cin>>n;
 cout<<"vnesi elementi na prviot vektor "<<endl;
 for (int i=0; i<n; i++)
 {
 cout<<"vnesi element ";
 cin>>x;
 v.push_back(x);
 }
cout<<"vnesi elementi na vtoriot vektor "<<endl;
 for (int i=0; i<n; i++)
 {
 cout<<"vnesi element ";
 cin>>x;
 v1.push_back(x);
 }
for (int i=0; i<n; i++)
 {
 v2.push_back(v[i]+v1[i]);
 }
 for (int i=0; i<v2.size(); i++)
 cout << v2[i] << " ";
 return 0;
}


Множество (set)


Mножествата се тип на асоцијативен контејнер во кој секој елемент треба да биде единствен (уникатен). Вредностите се зачувуваат по специфичен подреден редослед, т.е. растечки или опаѓачки.

Покрај set, постои и контејнер (multiset) кој овозможува чување и на неуникатни вредности (вредности кои може да се повторуваат). Овој контејнер (multiset) ги има истите карактеристики како и обичните множества.

Синтакса 

set <data_type> set_name;

Пример

set<int> val; // defining an empty set 
set<int> val = {6, 10, 5, 1}; // defining a set with values

#include <iostream>
#include <set>
using namespace std;
int main()

{
//SET
set<int> s;
for (int i=0; i<10; i++)
s.insert(i);
cout << s.size() << endl; //pechati '10'
for (int i=0; i<5; i++)
s.insert(i); //nema efekt
cout << s.size() << endl; //pechati '10'
s.erase(2);
s.erase(8);
cout << s.size() << endl; //pechati '8'

//MULTISET
multiset<int> ms;
for (int i=0; i<10; i++)
ms.insert(i);
cout << ms.size() << endl; //pechati '10'
for (int i=0; i<5; i++)
ms.insert(i);
cout << ms.size() << endl; //pechati '15'
ms.erase(2); //se brishat dvete 2-ki
ms.erase(8);
cout<<ms.size() << endl; //pechati '12'
return 0;
}

методи

insert - внесување на елемент во множество
erase - бришење на сите елементи со одредена вредност
size - големина (број на елементи) во едно множество


Доколку треба да ги изминеме сите елементи еден по еден (и да ги отпечатиме на екран), тоа може да го направиме со користење на итератори - движејќи се од почетокот (container.begin()) до крајот (container.end()) на множеството.

Постојат две методи со кои може да провериме дали еден елемент постои во множество или не - тоа се методите find и count. 
find -  враќа итератор до елементот кој го бараме (или container.end(), доколку елементот не постои), 
count го враќа бројот на елементи кои се еднакви на вредноста која ја бараме.


#include <iostream>
#include <set>
using namespace std;

int main()
{
//SET
set<int> s;
for (int i=0; i<10; i++)
s.insert(i);
if (s.find(5) != s.end())
cout << "DOBIVKA " << endl; //pechati 'DOBIVKA'
cout << s.count(2) << endl; //pechati '1'
s.erase(2);
cout << s.count(2) << endl; //pechati '0'
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
//pechati '0 1 3 4 5 6 7 8 9 '

//MULTISET
multiset<int> ms;
for (int i=0; i<10; i++)
ms.insert(i);
for (int i=0; i<5; i++)
ms.insert(i);
cout << ms.count(2) << endl; //pechati '2'
//izbrishi edna 2-ka
ms.erase(ms.find(2));
cout << ms.count(2) << endl; //pechati '1'
//izbrishi gi site elementi pomegju 5 i 8 (bez 8)
ms.erase(ms.find(5), ms.find(8));
return 0;
}
Output:
DOBIVKA
1
0
0 1 3 4 5 6 7 8 9
2
1

Пример
#include<iostream>
#include<set>
using namespace std;

int main(){
set<int> s = {10, 12, 15, 6};
set<int> :: iterator it;
cout<<"First element is:"<<*(s.begin()); // begin()
cout<<"\nLast element is:"<<*--(s.end())<<endl; // end()

// Traversal()
for (auto it = s.begin(); it!=s.end(); it++)
{  cout<<" "<<*it;   }
cout<<endl;
if(s.empty()) // empty()
cout<<"Empty";
else
cout<<"Not empty";
cout<<"\nSize of the set: "<<s.size(); // size()
cout<<"\nMax Size: "<<s.max_size(); //max_size()

s.erase(s.begin()); // erase(iterator)
s.erase(12); // erase(n)
cout<<"\nAfter removing the first element and the element 12: ";
for (auto it = s.begin(); it!=s.end(); it++)
{  cout<<" "<<*it;  }

s.insert(5); // insert(n)
cout<<"\nAfter inserting the new element 5: ";
for (auto it = s.begin(); it!=s.end(); it++)
{  cout<<" "<<*it;  }

if(s.count(15)==1)
cout<<endl<<"15 is present in the set";
else
cout<<endl<<"15 i not present";

s.clear(); // clear()
if(s.empty())
cout<<"\nNow, the set is empty";
else
cout<<"\nSet is not empty";
return 0;
}
Output
First element is:6
Last element is:15
6 10 12 15
Not empty
Size of the set: 4
Max Size: 230584300921369395
After removing the first element and the element 12: 10 15
After inserting the new element 5: 5 10 15
15 is present in the set
Now, the set is empty

Mапа

Мапа (map) претставува асоцијативен контејнер за чување на пар од податоци - клуч и вредност ( клучот е единствен, но вредноста не е.) 

На пример, можеби имаме потреба да направиме програма која ќе прочита одреден текст - листа од зборови (пример, "Biljana", "e", "najdobar", "ucesnik", "na"," muzickiot","natprevar", "vo", "Ohrid", "i", "vo", "Skopje"), и за секој од зборовите ќе изброи колку пати се појавува тој во текстот ( единствено "vo" се појавува повеќе од еднаш - )
"Biljana" = 1, "e" = 1, "najdobar" = 1, "ucesnik" = 1, "na" = 1, "muzickiot" =1, "natprevar" =1, vo" = 2, "Bitola" = 1, "i" = 1, "Skopje" = 1). 
Ова е пример за мапа каде клучеви се зборовите, а вредноста број кој означува колку пати се појавил клучот.

Синтакса 

map < key_type, value_type> map_name;

// create a map with integer keys and string values
map<int, string> student = {{1,"Jacqueline"}, {2,"Blake"}, {3,"Denise"}};

#include <iostream>
#include <map>
using namespace std;
int main()
{
map<string, int> m;
m["prv"] = 2;
m["vtor"] = 5;
m["tret"] = 13;
m["tret"] = m["tret"] + 12;

cout<< (m["tret"])<<endl;                                         //m["tret"] = 25
cout << m["prv"] << endl;                                         //pechati '2'
cout << m["vtor"] << endl;                                        //pechati '5'
cout << (m["prv"] + m["vtor"]) << endl;                  //pechati '7'
return 0;
}

Основни функции поврзани со мапа се: 

begin () - враќа итератор на првиот елемент на мапата 
end () - враќа итератор на елементот што теоретски го следи последниот елемент на мапата 
size () - го враќа бројот на елементи во мапата 
max_size () - враќа максимален број елементи што мапата може да ги содржи
empty () - враќа дали мапата е празна 
pair insert(keyvalue, mapvalue) - додава нов елемент на мапата 
erase(iterator position) - го отстранува елементот на позицијата посочена од итераторот 
erase (const g) - ја отстранува клучната вредност ‘g 'од мапата 
clear () - ги отстранува сите елементи од мапата

При декларирање на мапите (map<string, int> m), прво се наведува типот на клучот (во овој случај, string), а потоа типот на вредноста (во овој случај, int). За користење на map и multimap (мапа каде може да постојат повеќе елементи со ист клуч), потребно е вклучување на соодветната датотека која ја содржи нивната дефиниција ( #include <map> ).

Постојат два начини на пристап до елемент со одреден клуч: 
преку наведување на клучот во '[p]' загради (како во програмата) и 
преку користење на методот find. 

Притоа, методот find никогаш не резултира со менување на елементите во мапата. Од друга страна, '[p]' ќе креира нов пар (клуч, вредност) во мапата доколку таков клуч не постои. Како и кај множествата, може да го користиме методот count за да изброиме колку парови во мапата имаат клуч со одредена вредност. Кај map, резултатот секогаш ќе биде 1 (доколку постои таков клуч) или 0 (доколку не постои таков клуч). Од друга страна, кај multimap може да добиеме вредност која што е поголема од 1.

#include <iostream>
//#include <iterator>
#include <map>
using namespace std;
int main()
{
 map<int, char> map1;
 map<int, char>::iterator c;
 map1[1]='a';
 map1[2]='b';
 cout <<"kluc\tvrednost"<<endl;
 for(c = map1.begin(); c!=map1.end(); c++)
 {
 cout<<c->first;
 cout<< '\t'<<c->second<<'\n'<<endl;
 }
}
Output
kluc    vrednost
1       a

2       b

#include <iostream>
#include <map>
using namespace std;
int main() {

    map<int, string> student;
    student[1] = "Аna";
    student[2] = "Bojan";
    student[3] = "Denis";
    student[4] = "Marija";
    // declare map iterator
    map<int, string>::iterator iter;
    // use iterator to display map elements
    for (iter = student.begin(); iter != student.end(); ++iter) {
        cout << iter->first << " - " << iter->second << endl;
    }
    return 0;  
}
1 - Ana
2 - Bojan
3 - Denis
4 - Marija

#include <iostream>
#include <map>
using namespace std;
int main() {
    
    // create a map named student
    map <int, string> student {{1, "Denise"}, {2, "Blake"}, {3, "Courtney"}, {4, "John"}, {5, "Jennifer"}};

    // create a map iterator
    map <int, string>::iterator iter;
    
    // display initial map values
    cout << "Initial Values:" << endl;
    for(iter = student.begin(); iter != student.end(); ++iter) {
        cout << iter->second << ", ";
    }
       cout << endl;
     // remove a range of elements
    student.erase(student.find(2),student.find(5));
   // display final map values
    cout << "\nFinal Values:" << endl;
   for(iter = student.begin(); iter != student.end(); ++iter) {
        cout << iter->second << ", ";
    }
   return 0;
}
Output:
Initial Values:
Denise, Blake, Courtney, John, Jennifer, 

Final Values:
Denise, Jennifer,

Програма која креира асоцијативен контејнер мапа чии елементи се податоци за n студенти: ime од тип string - клуч, бодовите од два колоквиуми b1 и b2, а втор елемент од мапата е збир на бодовите од двата колоквиуми. Се печатат само студентите кои го положиле испитот.

#include <iostream>
#include <map>
#include <iterator>
#include <string>
using namespace std;
void mapvnesi(int n)
{
 string ime;
 int b1,b2,i,b;
 map<string, int> studenti;
 for(i=0;i<n;i++)
 {
 cout<<"vnesi ime na student"<<endl;
 cin>>ime;
 cout<<"vnesi gi bodovite od prv i vtor kolokvium"<<endl;
 cin>>b1>>b2;
 b=b1+b2;
 studenti.insert(pair<string,int>(ime, b));
 }
 cout<<"studenti koi go polozile ispitot se "<<endl;
 map<string, int>::iterator itr;
 for(itr = studenti.begin(); itr != studenti.end(); ++itr)
 {
 if(itr->second >=100)
 cout << itr->first << " " << itr->second << endl;
 }
}
int main()
{
 int n;
 cout<<"vnesi broj na studenti"<<endl;
 cin>>n;
 mapvnesi(n);
 return 0;
}

Програма која  креира асоцијативен контејнер мапа чии елементи се податоци за n автомобили: ime од тип string- клуч, година на производство од тип int - вредност. Се печатат само автомобилите кои се произведени во одредена година.

#include <iostream>
#include <map>
#include <iterator>
#include <string>
using namespace std;
void mapvnesi(int n)
{
 string ime;
 int godina,godina1,i;
 map<string, int> avtomobili;
 for(i=0;i<n;i++)
 {
 cout<<"vnesi ime na avtomobilot"<<endl;
 cin>>ime;
 cout<<"vnesi godina na proizvodstvo"<<endl;
 cin>>godina;
 avtomobili.insert(pair<string,int>(ime, godina));
 }
 cout<<"vnesi godina na proizvodstvo za prikaz na avtomobilite"<<endl;
 cin>>godina1;
 map<string, int>::iterator itr;
 for(itr = avtomobili.begin(); itr != avtomobili.end(); ++itr)
 {
 if(itr->second ==godina1)
 cout << itr->first << " " << itr->second << endl;
 }
}
int main()
{
 int n;
 cout<<"vnesi broj na avtomobili"<<endl;
 cin>>n;
 mapvnesi(n);
 return 0;
}

Напиши програма која со потпрограма креира асоцијативен контејнер мапа чии елементи се податоци за n ученици: ime од тип string- клуч, просек од тип flat -вредност. Да се печатат само учениците кои имаат многу добар успех.(за ученикот да биде многу добар просекот треба да биде поголем или еднаков на 3.5 и помал од 4.5) 

Покажувачи:

Покажувачот е променлива што ја содржи мемориската адреса на променливата кон која покажува. Како и секоја променлива, покажувачот исто така има тип на податок кој е ист како типот на податоци на променливата чија меморија ја складира. 

Синтакса за декларирање на покажувач во C++:

data_type* pointer_name 

Илустрација покажувачи

#include <iostream>
using namespace std;
int main()
{
int myVar = 10;           // initialize a variable myVar
int* ptr = &myVar;     // initialize a pointer ptr , pointing to myVar

// printing myVar will display 10
cout << "Value stored in myVar: " << myVar;
cout << "\n";

// printing *ptr will also display 10
cout << "Dereferenced pointer pointing to myVar: " << *ptr;
cout << "\n";

myVar++;                   // update the value of myVar

// now *ptr will print 11, since myVar has been updated
cout << "Dereferenced pointer pointing to myVar after updating myVar: ";
cout << *ptr;
cout << "\n\n";
return 0;
}
Value stored in myVar: 10
Dereferenced pointer pointing to myVar: 10
Dereferenced pointer pointing to myVar after updating myVar: 11

Итератори:

Итераторите се користат за укажување на мемориските адреси на контејнерите STL. Итератор е било кој објект кој покажувајќи на некој елемент од опсегот на елементи (може да е поле или контејнер), ја има способноста да ги измине сите елементи од опсегот

Покажувачите во C++ исто така може да укажуваат на функции, додека итераторите само служат за целта на извршување операции на контејнерите STL.

Итераторите овозможуваат движење низ елементите од еден контејнер, но и означување на групи податоци врз кои сакаме да вршиме одредени операции. Итераторите  нудат слични можности како и покажувачите: 
  • движење нанапред или наназад со помош на операторите ++ и -- 
  • скокање нанапред или наназад со одреден чекор (v.begin() + 20, v.end() - 4) 
  • добивање на вредноста кон која покажува итераторот (*it)
  • споредување со други итератори (!=, ==, <, <=, >, >=)  
  • одредување на растојанието (во број на елементи) помеѓу два итератори (користејќи го изразот it1 - it2, или преку повикување на методот distance)
Поради фактот што итераторите нудат слични операции како покажувачите, во C++ е овозможено користење на алгоритмите кои се дел од Стандардната библиотека на шаблони врз низи од податоци.

 Синтакса за декларирање итератор  во C++:

<Container_Type> :: iterator  name;

Container_Type: Овој параметар е типот на контејнер за кој е деклариран итераторот.

 type_container :: iterator itr_name

Илустрација итератори

#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v1 = { 10, 20, 30, 40 };           // initialize a vector
vector<int>::iterator itr;                            // declare an iterator

// access vector elements without iterator
cout << "Traversing without iterator : ";
for (int j = 0; j < 4; ++j) {
cout << v1[j] << " ";       }
cout << "\n";

// access vector elements using an iterator
cout << "Traversing using iterator ";
for (itr = v1.begin(); itr != v1.end(); ++itr)  {
cout << *itr << " ";            }
cout << "\n\n";

// insert an element into the vector
v1.push_back(50);

// access vector elements without iterator
cout << "Traversing without iterator : ";
for (int j = 0; j < 5; ++j) {
cout << v1[j] << " ";     }
cout << "\n";

// access vector elements using an iterator
cout << "Traversing using iterator ";
for (itr = v1.begin(); itr != v1.end(); ++itr) {
cout << *itr << " ";       }
cout << "\n\n";
return 0;
}
Traversing without iterator : 10 20 30 40 
Traversing using iterator 10 20 30 40 

Traversing without iterator : 10 20 30 40 50 
Traversing using iterator 10 20 30 40 50

Вектори и итератори 

Контејнер е секоја податочна структура којашто содржи елементи од ист тип.  До елементите во рамки на контејнерите се пристапува преку итератори. 




Пример 1
#include<iostream>
#include<iterator>     // for iterators
#include<vector>       // for vectors
using namespace std; 
int main() 
vector<int> ar = { 1, 2, 3, 4, 5 }; 
// Declaring iterator to a vector 
vector<int>::iterator ptr; 
// Displaying vector elements using begin() and end() 
cout << "The vector elements are : ";
 for (ptr = ar.begin(); ptr < ar.end(); ptr++) 
cout << *ptr << " ";
 return 0; 
}

Пример 2
#include <iostream>
#include <vector>
using namespace std;
int main()
{ vector <int> v;
for(unsigned i=0;i<15;i++)
v.push_back(i);
vector<int>::iterator it;
for(it=v.begin(); it!=v.end();it++)
cout << *it << ' ';
cout << endl;
return 0;
}
Output
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Објасни што ќе се прикаже со следниот код 

#include <iostream>
#include <vector>
using namespace std;
int main()
{
 int n,p,l;
 vector<int> v;                     // deklariranje na vektor
 cout<<"vnesi broj na elementi"<<endl;
 cin>>n;
 for(int p=0;p<n;p++)
 {
 cout<<"vnesi element"<<endl;
 cin>>l;
 v.push_back(l);  
 }
 vector<int>::iterator i;        // deklariranje na iterator
 int j,m;
 cout << "Bez iteratori = ";
 // Pristap do elementite bez koristenje na iteratori
 for (j = 0; j < n; ++j) {
 cout << v[j] << " ";    }
 cout << "\n so iteratori = ";
 // Pristap do elementite so koristenje na iteratori
 for (i = v.begin(); i != v.end(); ++i) {
 cout << *i << " ";    }
 // dodavanje na element na vektorot
 cout<<endl;
 cout<<"vnesi element ";
 cin>>m;
 v.push_back(m);
 
cout << "\nBez iteratori = ";
 // Pristap do elementite bez koristenje na iteratori
 for (j = 0; j<=n; ++j) {
 cout << v[j] << " ";    }
 
cout << "\nso iteratori = ";
 // Pristap do elementite so koristenje na iteratori
 for (i = v.begin(); i != v.end(); ++i) {
 cout << *i << " ";   }
 return 0;
}

Што ќе се прикаже
#include <iostream>
#include <vector>
using namespace std;
int main() {

    int n,x,sum = 0;
    vector<int> v;
    cout<<"vnesi broj na elementi: ";
    cin>>n;
    for(int i=0;i<n;i++)
    {
      cout<<"vnesi element: ";
      cin>>x;
      v.push_back(x);
    }
    vector<int>::iterator it;
    for ( it = v.begin(); it != v.end(); ++it) {
        if (*it % 4 == 0) {
            sum += *it;
        }
    }
   cout << "Zbirot na elementi e: " << sum << std::endl;
    return 0;
}

advance() - функцијата се користи за да ја зголеми позицијата на итераторот до наведениот број во аргументот на функцијата

#include <iostream>
#include <vector>
using namespace std;
int main()
{
 int n,l,k;
 vector <int> v;
 cout<<"vnesi broj na elementi: ";
 cin>>n;
 for(int i=0;i<n;i++)
 {
 cout<<"vnesi element: ";
 cin>>l;
 v.push_back(l);
 }
 vector<int>::iterator ptr = v.begin();
 cout<<"vnesi pozicija:";
 cin>>k;
 advance(ptr, k);
 cout << "Pozicijata na iteratorot po advance e: ";
 cout << *ptr << " ";
 return 0;
 }

Објасни го следниот код 
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 int main()
{
      vector<int> v;
      for (int i=0; i<10; i++)
            v.push_back((i*i*i) % 10);
         //v={0, 1, 8, 7, 4, 5, 6, 3, 2, 9}
      sort(v.begin(), v.end());
      //v={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
     
      //vrz nizi
      int array[10];
      for (int i=0; i<10; i++)
            array[i] = (i*i*i) % 10;
         //array={0, 1, 8, 7, 4, 5, 6, 3, 2, 9}
      sort(array, array+10);
      //array={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
       
      vector<int>::iterator it = v.begin();
      cout << *it << endl;                                //pechati '0'
      it++;
      cout << *it << endl;                                //pechati '1'
      *it = 7;
      //v={0, 7, 2, 3, 4, 5, 6, 7, 8, 9}
      cout << *it << endl;                                //pechati '7'
      it += 2;
      cout << *it << endl;                                //pechati '3'
       
      //izminuvanje na site elementi
      it = v.begin();
      while (it != v.end())
      {
            cout << *it << endl;
            it++;
      }
      cout << distance(v.begin(), v.end()) << endl;       //pechati '10'
     return 0;
}
Објасни го следниот код
#include <iostream>
#include <vector>
using namespace std;
int main() {
    // Using an iterator with an array
    int myArray[] = {1, 2, 3, 4, 5};
    int *p = myArray;
    for (int i = 0; i < 5; i++) {
        cout << *p << " ";
        p++;
    }
    cout << endl;
    // Using an iterator with a vector
    vector<int> myVector = {6, 7, 8, 9, 10};
    vector<int>::iterator it;
    for (it = myVector.begin(); it != myVector.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
    // Using an array
    int myArray2[5] = {11, 12, 13, 14, 15};
    for (int i = 0; i < 5; i++) {
        cout << myArray2[i] << " ";
    }
    cout << endl;
    // Using a vector
    vector<int> myVector2 = {16, 17, 18, 19, 20};
    for (int i = 0; i < myVector2.size(); i++) {
        cout << myVector2[i] << " ";
    }
    cout << endl;
    return 0;
}

Пример за сортирање 
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//Funkcija za pecatenje na elementite od vektorot a
void print( vector<int> a)
{
 for(vector<int>::iterator ai=a.begin(); ai!=a.end(); ++ai)
   cout << *ai << " "; }

int main()
{ int n,i,k;
  vector<int> a;                            //Deklarirame vektor a
 cout<<"vnesi broj na elementi"<<endl;
 cin>>n;
 cout<<"vnesi gi elementite"<<endl;
 for(i=0;i<n;i++)
 {
    cin>>k;
    a.push_back(k);    }
 //Elementite od vektorot se
 print(a);
 /*Gi sortirame elementite od vektorot, preku povikuvanje na metodata sort od
 STL <algorithm> bibliotekata*/
 sort( a.begin(), a.end() );
 //Elementite se podredeni
 print(a);
 return 0;
}

Задачи:

1. Да се напише програма со која се пресметува збир на броевите од вектор v со n елементи кои се делат со 4.
2. Да се напише програма со која се пресметува аритметичка средина на вектор v со n елементи чии елементи се цели броеви
3. Да се напише програма со која се печатат елементите на вектор v со n елементи кои имаат збир на цифри непарен број
4. Да се напише програма со која се печати збир на елементите на вектор v со n елементи кои се трицифрени броеви.
6. Што ќе се прикаже 
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector <int> myvector;
     for(int i=1;i<=10;i++)
     myvector.push_back(i);
     myvector.erase(myvector.begin()+6);
     myvector.erase(myvector.begin(),myvector.begin()+4);
      for(unsigned i=0; i < myvector.size();++i)
     cout<<' '<<myvector[i];
    return 0;
}


Three types of containers are ____________.
 A. sequence containers
 B. linear containers
 C. associative containers
 D. container adapters
 E. wrapper containers

Three components in STL are ____________.
 A. containers
 B. iterators
 C. algorithms
 D. linked lists
 E. vectors

Which of the following are sequence containers?
 A. list
 B. queue
 C. deque
 D. map
 E. set

Which of the following are associative containers?
 A. list
 B. queue
 C. deque
 D. map
 E. set

Which of the following are container adapters?
 A. list
 B. queue
 C. deque
 D. multimap
 E. stack

No comments: