Re: Сортировка
Добавлено: 20 май 2010, 18:34
Я делал вывод из вектора не получилось
Если нетрудно покажите как это сделать
Зарание спасибо
Если нетрудно покажите как это сделать
Зарание спасибо
Код: Выделить всё
#include <iostream>
#include <iterator>
#include <conio.h>
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#include <vector>
using namespace std;
struct Perech
{int nomer;
char outpunkt[20];
char inpunkt[20];
int cost;
int mest;
};
template<class T>
class vokzal
{
private:
Perech *px;
int n;
int f;
std::vector<Perech> v;
struct NameSortPred { bool operator()(const Perech& a, const Perech& b) const { return a.outpunkt<b.outpunkt;}};
struct DateSortPred { bool operator()(const Perech& a, const Perech& b) const { return a.nomer<b.nomer;}};
public:
vokzal(){n=0;px=NULL;}
~vokzal(){n=0;if(px!=NULL)delete[]px;}
void newBD();
void output();
void sortByName();
void del();
};
template<class T>
void vokzal<T>::newBD()
{
int i;
cout<<"Kolichestvo zapisey=";cin>>n;
if(px!=NULL)delete[] px;
px=new Perech[n];
if(px==NULL){cout<<"Net pamyati\n";getch();n=0;return;}
//создание базы данных
for(i=0;i<n;i++)
{cout<<"Nomer avtobusa:";cin>>px[i].nomer;
cout<<"Punkt otpravleniya: ";cin>>px[i].outpunkt;
cout<<"Punkt naznacheniya: ";cin>>px[i].inpunkt;
cout<<"Stoimost bileta: ";cin>>px[i].cost;
cout<<"Kolichestvo mest: ";cin>>px[i].mest;
cout<<endl;
v.push_back(px[i]);
}cout<<"Baza dannuih sozdana";getch();
}
template<class T>
void vokzal<T>: :o utput(){
{
if (v.size() == 0)
cout << "Empty" << endl;
clrscr();
cout.setf(ios::left);
cout<<endl<<"Baza dannuih 'Avtovokzal'\n"<<endl;
cout<<"N"<<" "<<setw(6)<<"Nomer"<<setw(12)<<"Otpravlenie"<<setw(11)<<"Pribuitie"
<<setw(7)<<"Vremya"<<setw(17)<<"kolichestvo mest"<<setw(8)<<"Stoimost"<<endl;
for (size_t i = 0; i < v.size(); i++){
{cout.setf(ios::left); i++;
cout<<setw(3)<<i<<setw(6)<<v[i-1].nomer<<setw(12)<<v[i-1].outpunkt<<setw(11)<<v[i-1].inpunkt
<<setw(17)<<v[i-1].mest<<setw(8)<<v[i-1].cost<<endl;
i--; }
}
getch();
}
}
template<class T>
void vokzal<T>::sortByName()
{
sort(v.begin(),v.end(),DateSortPred());
}
template<class T>
void vokzal<T>::del(){
output();
cout<<"vvedite nomer stroki";cin>>n;
v.erase(v.begin(),v.begin()+n);
output();
}
int main(){
vokzal<Perech> a;
a.newBD();
a.sortByName();
a.output();
return 0;
}
Код: Выделить всё
v.erase(v.begin() + (n-1)); //n-1, так как нумерация элементов начинается с нуля
Код: Выделить всё
#include <iostream>
#include <iterator>
#include <conio.h>
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#include <vector>
using namespace std;
struct Perech
{int nomer;
char outpunkt[20];
char inpunkt[20];
int cost;
int mest;
};
template<class T>
class vokzal
{
private:
Perech *px;
int n;
int f;
std::vector<Perech> v;
struct NameSortPred { bool operator()(const Perech& a, const Perech& b) const { return a.outpunkt<b.outpunkt;}};
struct DateSortPred { bool operator()(const Perech& a, const Perech& b) const { return a.nomer<b.nomer;}};
struct SearchPred { char Search[20]; bool operator()(const Perech& a) const { return a.outpunkt==Search ;} };
public:
vokzal(){n=0;px=NULL;}
~vokzal(){n=0;if(px!=NULL)delete[]px;}
void newBD();
void output();
void sortByName();
void del();
bool Search();
};
template<class T>
void vokzal<T>::newBD()
{
int i;
cout<<"Kolichestvo zapisey=";cin>>n;
if(px!=NULL)delete[] px;
px=new Perech[n];
if(px==NULL){cout<<"Net pamyati\n";getch();n=0;return;}
//ñîçäàíèå áàçû äàííûõ
for(i=0;i<n;i++)
{cout<<"Nomer avtobusa:";cin>>px[i].nomer;
cout<<"Punkt otpravleniya: ";cin>>px[i].outpunkt;
cout<<"Punkt naznacheniya: ";cin>>px[i].inpunkt;
cout<<"Stoimost bileta: ";cin>>px[i].cost;
cout<<"Kolichestvo mest: ";cin>>px[i].mest;
cout<<endl;
v.push_back(px[i]);
}cout<<"Baza dannuih sozdana";getch();
}
template<class T>
void vokzal<T>: :o utput(){
{
if (v.size() == 0)
cout << "Empty" << endl;
clrscr();
cout.setf(ios::left);
cout<<endl<<"Baza dannuih 'Avtovokzal'\n"<<endl;
cout<<"N"<<" "<<setw(6)<<"Nomer"<<setw(12)<<"Otpravlenie"<<setw(11)<<"Pribuitie"
<<setw(7)<<"Vremya"<<setw(17)<<"kolichestvo mest"<<setw(8)<<"Stoimost"<<endl;
for (size_t i = 0; i < v.size(); i++){
{cout.setf(ios::left); i++;
cout<<setw(3)<<i<<setw(6)<<v[i-1].nomer<<setw(12)<<v[i-1].outpunkt<<setw(11)<<v[i-1].inpunkt
<<setw(17)<<v[i-1].mest<<setw(8)<<v[i-1].cost<<endl;
i--; }
}
getch();
}
}
template<class T>
void vokzal<T>::sortByName()
{
sort(v.begin(),v.end(),DateSortPred());
}
template<class T>
void vokzal<T>::del(){
output();
cout<<"vvedite nomer stroki";cin>>n;
v.erase(v.begin()+(n-1));
output();
}
template<class T>
bool vokzal<T>::Search()
{ cout<<"Search: ";cin>>Search;
std::vector<Perech>::iterator r = find_if(v.begin(), v.end(), SearchPred());
return r != v.end();
}
int main(){
vokzal<Perech> a;
a.newBD();
a.sortByName();
a.Search();
a.del();
a.output();
return 0;
}
Код: Выделить всё
struct SearchPred
{
private:
char *searchWord;
public:
explicit SearchPred(char *search):searchWord(search) {}
bool operator()(const Perech& a) const { return strcmp(&(a.outpunkt[0]), searchWord) == 0; }
/*оператор == не подходит для лексикографического сравнения массивов символов,
посему используем strcmp*/
};
Код: Выделить всё
template<class T>
void vokzal<T>::Search()
{
char srch[20];
cout<<"Search: ";cin>>srch;
//обрати внимание на вызов предиката
std::vector<Perech>::iterator r = find_if(v.begin(), v.end(), SearchPred(&srch[0]));
//r , в случае удачи, указывает на найденный элемент,
//если поиск не удачен r указывает на конец.
if(r == v.end())
{
//сообщаем об ошибке
cout << "Element " << srch << " is not contained in the data base!" << endl;
}
else
{
/*если следовать стилю всех твоих функций,
то вывод найденного элемента на экран должен быть тут.*/
}
}