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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2009, 01:52   #1
Ultimate
 
Регистрация: 03.09.2009
Сообщений: 3
По умолчанию C++/STL как правильно удалить элемент из вектора?

Доброй ночи...
Не могу понять, почему при использовании erase к вектору программа неожиданно закрывается.
Код:

PHP код:
#include <iostream>
#include <conio.h>
#include <vector>

using namespace std;

vector <bool(*)()> mng;
vector <bool(*)()>::iterator i;
//--------------------------------------------------------
bool my1(){
    
cout<<"my1"<<endl;
    return 
true;
}
//--------------------------------------------------------
bool my2(){
    
std::cout<<"my2"<<endl;
    return 
false;
}
//--------------------------------------------------------

void main(){
    
bool(*p1)(); //указатель на функцию 1
    
bool (*p2)(); // на фукцию 2
    
p1=&my1;
    
p2=&my2;
    
    
mng.push_back(p1); // отправляем указатель в вектор
    
mng.push_back(p2); 
    
bool result=true;

    
    for(;;)
// бесконечный цикл
    
{
    
    for(
i=mng.begin();i!=mng.end();i++)
    {
        
result=(*i)();
        
cout<<"Size="<<mng.size()<<endl;
        if (
result==false) {mng.erase(i);cout<<"delete"<<endl;}
    
        
getch();
    }
    
    }
getch();

Суть программы такова: есть вектор, который хранит в себе указатели на функции вида bool *(void). Так вот, в бесконечном цикле происходит вызов каждой функции по указателю в векторе(с этим все нормально). Если функция возвращает false, данный указатель на эту функцию из вектора удаляется.

По непонятным мне причинам, после удаления, прерывается бесконечный цикл.
Ultimate вне форума Ответить с цитированием
Старый 04.09.2009, 01:58   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Используй remove_if
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 04.09.2009, 01:59   #3
Ultimate
 
Регистрация: 03.09.2009
Сообщений: 3
По умолчанию

Спасибо, проблема решена

После выполнения mng.erase(i); итератор указывает автоматически на следующий элемент в векторе, а из-за того что в цикле есть i++ то итератор еще раз увеличивается. В следствии чего не понятно куда он указывает и непонятно что мы пытаемся вызвать.
Ultimate вне форума Ответить с цитированием
Старый 04.09.2009, 10:07   #4
LaptevVV
Пользователь
 
Регистрация: 15.08.2009
Сообщений: 37
По умолчанию

Цитата:
Сообщение от Ultimate Посмотреть сообщение
Доброй ночи...
Не могу понять, почему при использовании erase к вектору программа неожиданно закрывается.
По непонятным мне причинам, после удаления, прерывается бесконечный цикл.
После удаления итератор становится недействительным. То есть, как себя поведет программа - одному Богу известно. Нельзя в цикле с помощью итераторов физически удалять элементы.
Обычно в цикле используют remove(), а потом после цикла удаляют все скопом.
LaptevVV вне форума Ответить с цитированием
Старый 04.09.2009, 20:36   #5
Infinum
Новичок
Джуниор
 
Регистрация: 04.09.2009
Сообщений: 1
По умолчанию

Цитата:
Сообщение от ISergeyN Посмотреть сообщение
Используй remove_if
Не подскажешь??
Как удалить строку/столбец из двумерного вектора?
Имеем вектор v[N] [M].
Код:
std::vector<std::vector<int> > v( N, std::vector<int>M);
Как с помощью функции .erase() библиотеки vector удалить строчку x, чтоб массив стал v[N-1] [M]?
Infinum вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с использованием вектора STL C++ Ultimateorb Помощь студентам 2 18.08.2009 00:40
добавить/удалить элемент Revenholm Общие вопросы C/C++ 3 13.06.2009 17:17
Массив в Си. как определить и удалить строчку в которой находится макс элемент Софья9 Помощь студентам 15 11.06.2009 18:46
Как правильно удалить Unit2 Небесный Общие вопросы Delphi 3 07.06.2008 22:36
Как правильно удалить с компа Keylogger? Кира Помощь студентам 4 17.12.2007 16:51