IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> STL, Итераторы C++
ammaximus
сообщение 11.02.2009 10:08
Сообщение #1


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


Работа с библиотекой STL. Требуется создать вектор указателей на объекты типа алкогольные напитки. Программа должна уметь добавлять новый элемент, удалять элемент, сортировать по убыванию названия, находить первое включение указанного напитка.
1. В чем ошибки? Нерабочие участки программы закомментированы.
2. Как реализовать по убыванию с помощью итератора? Что за итератор возвращает обратное значение
3. Как присвоить значение итератору? У меня что то = не работает.
 #include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#define n 5
using namespace std;
///////////////////////////////////////
class liquido{
protected:
string name;
double ro;
public:
liquido(){
name="acqua";
ro=0;
}

liquido(string str){
name=str;
ro=0;
}

liquido(string str, double p){
name=str;
ro=p;
}


void print(){
cout << "Liquido " << name << endl;;
cout << "R\'o " << ro << endl;;
}

void set_ro(double p){
ro=p;
}

void set_name(string str){
name=str;
}



};
/////////////////////////////////////////////
class alcohol:public liquido{
float carico;
public:
alcohol(){
name="acqua";
ro=0;
carico=0;
}

alcohol(string str){
name=str;
ro=0;
}

alcohol(string str, double p){
name=str;
ro=p;
carico=0;
}

alcohol(string str, double p, float c){
name=str;
ro=p;
carico=c;
}
void set_c(float c){
carico=c;
}

void print(){
cout << "\nLiquido " << name << endl;;
cout << "R\'o " << ro << "; Carico " << carico << endl;
}

friend bool operator==(const alcohol& a1, const alcohol& a2){
return (a1.name==a2.name);
}

friend bool operator<(const alcohol& a1, const alcohol& a2){
return (a1.name<a2.name);
}




};
//////////////////////////////////////////////
////Function objects//////////////////////////
//////////////////////////////////////////////
class compareAlcohol{
public:
bool operator()(const alcohol* a1, alcohol* a2){
return *a1<*a2;
}
};
//////////////////////////////////////////////
//class printAlcohol{
//public:
// void operator() (const alcohol* a){
// *a->print();
// }
//};
/////////////////////////////////////////////
/////////MAIN////////////////////////////////
/////////////////////////////////////////////


int main(){
alcohol Martini("Martini Bianco 1863", 986.5, 18.5f);
alcohol Martini2("Martini Bianco 1863", 986.5, 18.5f);
Martini.print();
Martini.set_c(19.5f);
Martini.set_ro(987.);
Martini.print();
////////////////////////////////
alcohol* temp;
string gen;
vector<alcohol*> MyVector;
vector<alcohol*>::iterator MyIterator;
for (int i=0; i<n; i++){
gen= "Alcohol"+i;
cout << gen << endl;
temp = new alcohol(gen, i+10, i);
MyVector.push_back(temp);
}
cout << MyVector.size()<<endl;
// for_each(MyVector.begin(), MyVector.end(), printAlcohol);//output
// sort(MyVector.begin(), MyVector.end(), compareAlcohol);

/////////////////
///////////////
//////////ADD ELEMENT///////////
////////////////////////////////

temp = new alcohol("NEW ALCOHOL", 893.7, 39.4f);
// MyIterator=3;
// MyVector.insert(temp,MyIterator);
// for_each(MyVector.begin(), MyVector.end(), printAlcohol);//output

////////////////////////////////
////////DELETE ELEMENT//////////
////////////////////////////////
cout << "Which element delete?";
cin >> i;
delete MyVector[i];
// MyIterator = i;
// MyVector.erase(MyIterator,MyIterator);
// for_each(MyVector.begin(), MyVector.end(), printAlcohol);//output
////FIND ELEMENT/////
string sname;
cout << "Put Name for search";
cin >> sname;
// MyIterator=find(MyVector.begin(), MyVector.end(), sname);
// cout << MyIterator;



////////////CLEAR///////////////////////////////
while (!MyVector.empty()){
delete MyVector.back();
MyVector.pop_back();
}
return 0;
}



--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 11.02.2009 23:41
Сообщение #2


Гость






Цитата
1. В чем ошибки? Нерабочие участки программы закомментированы.
А у тебя ошибки начинаются еще ДО того, как что-то закомментировано... Ну, например, ты в конструкторе класса alcohol зачем-то присваиваешь значения унаследованным полям сам, хотя для этого есть конструктор предка... Кстати, конструктор предка ты должен вызывать в конструкторе потомка, ты этого не делаешь... + к этому, есть такое понятие, как значения по умолчанию, то есть, вместо трех перегрузок конструктора liquido, достаточно:

class liquido {
liquido(string s = "acqua", double d = 0.0) {
name = s; ro = d;
}

// ...

class alcohol: public liquido {
alcohol(string s = "acqua", double d = 0.0, float f = 0.0): liquido(s, d) {
carico = f;
}
// ...
, это перекрывает все возможные комбинации, которые ты реализовывал вручную.

2) Инициализация:
Цитата
	for (int i=0; i<n; i++){
gen= "Alcohol"+i;
cout << gen << endl;
temp = new alcohol(gen, i+10, i);
MyVector.push_back(temp);
}
делает совсем не то, что ты подразумевал. В частности, "Alcohol" + 1 = "lcohol", а +2 = "cohol", ты сложением просто задаешь смещение от начала строки... Ты же хотел добавлять цифру в конец? Ну, так добавляй:
	char gen[20] = {0};
for (int i=0; i<n; i++){
sprintf(gen, "Alcohol%d", i);
cout << gen << endl;
temp = new alcohol(gen, i+10, i);
MyVector.push_back(temp);
}

3) Попытка печати вектора: ошибка, потому что printAlcohol должен быть не классом, а функцией:
void print_alcohol(alcohol *a) {
a->print();
}
// ...
for_each(MyVector.begin(), MyVector.end(), print_alcohol);
, а вот дальше, при попытке отсортировать вектор, ты делаешь обратную ошибку... У тебя есть класс, в котором который ввел предикат сравнения, но передавать-то тебе в std::sort надо не класс, а сам предикат:
sort(MyVector.begin(), MyVector.end(), compareAlcohol()); // вот так - правильно 


4) Добавление элемента в вектор:
	temp = new alcohol("NEW ALCOHOL", 893.7, 39.4f);
MyIterator=MyVector.begin() + 3; // Все очень просто, не число, а смещение от начала
MyVector.insert(MyIterator, temp); // сначала - итератор, потом - элемент


5) Удаление элемента... Я бы сделал это вот так:
	cout << "Which element delete?";
cin >> i;
delete (temp = MyVector[i]);
MyVector.erase(MyVector.begin() + i);


По-моему ничего не забыл...
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 30.07.2025 4:07
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"