Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2011, 18:49   #11
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Код:
	void remove(Student &obj) {
		
		std::vector<Student>::iterator it;
		for (it=data.begin(); it!=data.end(); it++)
			if (strcmp(it->get_name(),obj.get_name())) {
				it = data.erase(it);
				break;
			}
вот оно :cry:
onewho вне форума Ответить с цитированием
Старый 02.03.2011, 18:50   #12
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Код:
Замени на it = data.erase(it). Делов-то.
После этого it указывает на следующий за удаленным элемент.
Потом делаем it++, в результате пропускаем один эл-т
Д_М вне форума Ответить с цитированием
Старый 02.03.2011, 18:54   #13
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

не работает)))
к тому же мне кажется уж после этого это никак не влияет ибо break;
onewho вне форума Ответить с цитированием
Старый 02.03.2011, 18:58   #14
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Ты его неправильно понял. Тебе надо делать так:
Код:
void remove(Student &obj) {
		
		std::vector<Student>::iterator it;
		for (it=data.begin(); it!=data.end(); it++)
			if (strcmp(it->get_name(),obj.get_name())) {
				it = data.erase(it);
                                --it;
			}
Но лучше делать через перегрузку operator== и юзать erase без написания всяких циклов.

Ещё вариант -- data.erase(std::remove_if(data.begi n(), data.end(), <сюда впихни фугнкцию-сравнивалку>), data.end());

Всё, я спать, а то уже 30 часов без сна
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 02.03.2011 в 19:02.
Obey-Kun вне форума Ответить с цитированием
Старый 02.03.2011, 19:02   #15
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Печально но и это не работает.
И еще ребят, вам не кажется что после it = data.erase(it);
всякие -- и ++ какбы не имеют смысла?

Я блин в тупике
onewho вне форума Ответить с цитированием
Старый 02.03.2011, 19:10   #16
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
И еще ребят, вам не кажется что после it = data.erase(it);
всякие -- и ++ какбы не имеют смысла?
Имеют. data::erase возвращает валидный итератор.

Я бы вообще шерстил вектор от конца к началу.
Д_М вне форума Ответить с цитированием
Старый 02.03.2011, 19:19   #17
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

а это что for (it=data.begin(); it!=data.end(); it++) ?
поцаны хелп))
onewho вне форума Ответить с цитированием
Старый 02.03.2011, 20:00   #18
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Кажется нашел.
Не хватает оператора копирования. Вызывается автоматически сгенеренный компилятором, и при освобождении name портится память

Надо вставить


Код:
        Student& operator=(const Student& obj) {
                name = new char[strlen(obj.name)+1];
                strcpy(name,obj.name);
                for (int i=0; i<n; i++)
                        marks[i]=obj.marks[i];
        }
И еще

Код:
if (strcmp(it->get_name(),obj.get_name())) {
                                it = data.erase(it);
здесь по смыслу надо strcmp(it->get_name(),obj.get_name()) != 0
Д_М вне форума Ответить с цитированием
Старый 02.03.2011, 20:07   #19
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

офигеть... Д_М ты бох.. заработало!
нет, там надо именно ==0. т.к такое значение возвращает strcmp() если строки равны

кстати и такая форма
Код:
data.erase(it);
тоже работает

и никакого присваивания... объясните ?!
onewho вне форума Ответить с цитированием
Старый 02.03.2011, 20:15   #20
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Код:
нет, там надо именно ==0
Да-да, описка у меня
Д_М вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
class vector Proghelper Помощь студентам 5 09.12.2010 21:31
#include <vector> GBAXA Visual C++ 12 15.08.2010 11:25
итераторы и vector.erase( Teksa Общие вопросы C/C++ 5 28.04.2010 15:05
vector NiCola999 Помощь студентам 5 26.02.2010 08:37
std::vector ciaonataha Общие вопросы C/C++ 1 10.05.2009 15:50