![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
ammaximus |
![]()
Сообщение
#1
|
![]() Ночной волк ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Репутация: ![]() ![]() ![]() |
Работа с библиотекой STL. Требуется создать вектор указателей на объекты типа алкогольные напитки. Программа должна уметь добавлять новый элемент, удалять элемент, сортировать по убыванию названия, находить первое включение указанного напитка.
1. В чем ошибки? Нерабочие участки программы закомментированы. 2. Как реализовать по убыванию с помощью итератора? Что за итератор возвращает обратное значение 3. Как присвоить значение итератору? У меня что то = не работает. #include <iostream> -------------------- Не думай о белой обезьяне.
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата 1. В чем ошибки? Нерабочие участки программы закомментированы. А у тебя ошибки начинаются еще ДО того, как что-то закомментировано... Ну, например, ты в конструкторе класса alcohol зачем-то присваиваешь значения унаследованным полям сам, хотя для этого есть конструктор предка... Кстати, конструктор предка ты должен вызывать в конструкторе потомка, ты этого не делаешь... + к этому, есть такое понятие, как значения по умолчанию, то есть, вместо трех перегрузок конструктора liquido, достаточно:class liquido {, это перекрывает все возможные комбинации, которые ты реализовывал вручную. 2) Инициализация: Цитата for (int i=0; i<n; i++){ char gen[20] = {0}; 3) Попытка печати вектора: ошибка, потому что printAlcohol должен быть не классом, а функцией: void print_alcohol(alcohol *a) {, а вот дальше, при попытке отсортировать вектор, ты делаешь обратную ошибку... У тебя есть класс, в котором который ввел предикат сравнения, но передавать-то тебе в std::sort надо не класс, а сам предикат: sort(MyVector.begin(), MyVector.end(), compareAlcohol()); // вот так - правильно 4) Добавление элемента в вектор: temp = new alcohol("NEW ALCOHOL", 893.7, 39.4f); 5) Удаление элемента... Я бы сделал это вот так: cout << "Which element delete?"; По-моему ничего не забыл... |
ammaximus |
![]()
Сообщение
#3
|
![]() Ночной волк ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо огрмное Volvo. Все исправил.
Только не выходит Find MyIterator = find(MyVector.begin(), MyVector.end(), Martini); Этот код должен найти в векторе элемент равный Мартини, только не работает. И еще, можно использовать find, чтобы найти по параметру объекта, не используя лишние объекты. т.е. MyIterator = find(MyVector.begin(), MyVector.end(), Martini.carico); или просто MyIterator = find(MyVector.begin(), MyVector.end(), "Alcohol2"); Два учебника уже прочитал, нигде нет подробного описания этой функции. -------------------- Не думай о белой обезьяне.
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата И еще, можно использовать find, чтобы найти по параметру объекта, не используя лишние объекты Используй find_if:// пишешь свой функтор, но для того, чтобы это работало, придется в классе liquido сделать геттер get_name(), иначе к полю name нет доступа, оно защищенное, а не общее... Цитата Два учебника уже прочитал, нигде нет подробного описания этой функции. Какие учебники ты читал? |
ammaximus |
![]()
Сообщение
#5
|
![]() Ночной волк ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Репутация: ![]() ![]() ![]() |
Т.Павловская, методичку свою, еще какие-то документы без названия..
Можешь что-нибудь посоветовать по STL? У меня очень дорогой hsdpa интернет, я не могу позволить себе скачивать все подряд, а потом разбираться. Кстати я не понял вот это finder : std::binary_function<alcohol*, string, bool> -------------------- Не думай о белой обезьяне.
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата finder : std::binary_function<alcohol*, string, bool> Хм... Ну, смотри... Создаем свой функтор - наследник от класса std::binary_function, то есть, функтор (так же как делает это binary_function) будет принимать 2 аргумента: первый - типа alcohol*, второй - типа string... А возвращать функтор будет значение типа bool (именно в таком порядке конкретизируется binary_function<>: тип первого параметра, тип второго параметра, и тип результата, обрати внимание).А теперь - суть этого метода: при проходе по вектору КАЖДЫЙ его элемент передается в созданный функтор, и там сравнивается с заданной строкой... Причем, поскольку использована bind2nd, то доп. аргумент(строка в нашем случае) передается вторым параметром, а итератор - первым. Если надо, чтобы сначала передавался доп. аргумент, а потом - итератор, то используется bind1st... Ну, к примеру, можно было бы переписать функтор с другим порядком аргументов: struct id_finder : std::binary_function<string, alcohol*, bool> , и вызвать MyIterator = find_if(MyVector.begin(), MyVector.end(), bind1st(finder(), "Alcohol3"));, тоже было бы корректно... Цитата Можешь что-нибудь посоветовать по STL? Я пользуюсь книгой Николай Джосьютис, С++ Стандартная библиотека для профессионалов, ISBN: 5-94723-635-4 (английский вариант: "The C++ Standard Library: A Tutorial and Reference" Nicolai M. Josuttis, ISBN: 0-201-37926-0) и Scott Meyers: Effective STL |
![]() ![]() |
![]() |
Текстовая версия | 18.06.2025 10:23 |