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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2010, 21:33   #1
Екатерина3439
Новичок
Джуниор
 
Регистрация: 23.06.2010
Сообщений: 3
По умолчанию пграмма совершает аварийное прерывание.как сделать так чтобы она работала нормально?

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

int main()
{ vector<int>iVec;
int x,n;
cout<<"n=";cin>>n;
for (int i=0;i<n;i++)
{
cout<<"vvedite "<<i<<" el vectora"<<endl;
cin>>x;
iVec.push_back(x);
}

int z;
cout<<"z= ";cin>>z;

vector <int>::iterator i=iVec.begin();
while (i<iVec.end())
{if (*i%10==z) iVec.erase(i); else i++;}

for (vector <int>::iterator iter=iVec.begin();iter<iVec.end();i ter++)
cout<<*iter<<endl;
return 0 ;}
Екатерина3439 вне форума Ответить с цитированием
Старый 23.06.2010, 21:51   #2
TGrey[WoLf]
Пользователь
 
Регистрация: 21.06.2010
Сообщений: 27
По умолчанию

Код:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

int main()
{ 
	vector<int>iVec;
	int x,n;
	cout<<"n=";cin>>n;
	for (int i=0;i<n;i++)
	{
		cout<<"vvedite "<<i<<" el vectora"<<endl;
		cin>>x;
		iVec.push_back(x);
	}

	int z;
	cout<<"z= ";
	cin>>z;

	vector <int>::iterator i2=iVec.begin();
	while (i2<iVec.end())
	{
		if (*i2%10==z) 
			iVec.erase(i2); 
		else 
			i2++;
	}

	for (vector <int>::iterator iter=iVec.begin();iter<iVec.end();iter++)
	cout<<*iter<<endl;
	return 0 ;
}
TGrey[WoLf] вне форума Ответить с цитированием
Старый 23.06.2010, 22:07   #3
Екатерина3439
Новичок
Джуниор
 
Регистрация: 23.06.2010
Сообщений: 3
По умолчанию

все равно совершает аварийное прерывание(((
Екатерина3439 вне форума Ответить с цитированием
Старый 23.06.2010, 22:27   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
i2 = iVec.erase(i2);
http://cplusplus.com/reference/stl/vector/erase/
netrino вне форума Ответить с цитированием
Старый 23.06.2010, 23:09   #5
TGrey[WoLf]
Пользователь
 
Регистрация: 21.06.2010
Сообщений: 27
По умолчанию

Ну я там и убеждался, что удаление верное.
Цитата:
iterator erase ( iterator position );
position
Iterator pointing to a single element to be removed from the vector.
Да и я у себя откопили, все работало.
Вводил
н=3
7
20
27
z=0
выводило
7
27
TGrey[WoLf] вне форума Ответить с цитированием
Старый 23.06.2010, 23:14   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от TGrey[WoLf] Посмотреть сообщение
Ну я там и убеждался, что удаление верное.
Цитата:
This invalidates all iterator and references to elements after position or first.
Он возвращает новый итератор, который является верным )
Вы видимо компилировали в релиз-сборке, или не в студии. В отладочной версии, в реализации вектора стоит ассерт на проверку валидности итератора. Ясно, что проблемы зависят от реализации, их может и не быть вовсе, но лучше следовать стандарту )
netrino вне форума Ответить с цитированием
Старый 23.06.2010, 23:20   #7
TGrey[WoLf]
Пользователь
 
Регистрация: 21.06.2010
Сообщений: 27
По умолчанию

=) Делал в 6 студии. В Дебаг сборке. Но спасибо, возьму тоже на заметку, думаю еще пригодится.
Код:
	vector <int>::iterator i2=iVec.begin();
	while (i2<iVec.end())
	{
		if (*i2%10==z)
                {
			iVec.erase(i2); 
                        i2 = iVec.begin();
                }
		else 
			i2++;
	}
Так сойдет тогда?

Последний раз редактировалось TGrey[WoLf]; 23.06.2010 в 23:22.
TGrey[WoLf] вне форума Ответить с цитированием
Старый 23.06.2010, 23:26   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от TGrey[WoLf] Посмотреть сообщение
=) Делал в 6 студии. В Дебаг сборке. Но спасибо, возьму тоже на заметку, думаю еще пригодится.
Код:
	vector <int>::iterator i2=iVec.begin();
	while (i2<iVec.end())
	{
		if (*i2%10==z)
                {
			iVec.erase(i2); 
                        i2 = iVec.begin();
                }
		else 
			i2++;
	}
Так сойдет тогда?
6-я студия плохо стандарт поддерживает )
Зачем так, можно как я написал
Код:
while (i2<iVec.end())
{
	if (*i2%10==z)
		i2 = iVec.erase(i2); 
	else 
		i2++;
}
netrino вне форума Ответить с цитированием
Старый 24.06.2010, 00:27   #9
TGrey[WoLf]
Пользователь
 
Регистрация: 21.06.2010
Сообщений: 27
По умолчанию

То я туплю или где там разница?)


Аааа все увидел)) Ну да.
TGrey[WoLf] вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так чтобы.. Дима я Общие вопросы Delphi 2 05.01.2010 19:03
Нужна помощь! Нужно переделать программу написанную на дельфи, чтобы она работала под управлением Vista Karloss Фриланс 5 10.11.2008 17:14
Как сделать программу, чтобы она запускалась везде? grenles Общие вопросы C/C++ 3 11.06.2008 21:10
как сделать так что при изменении разрешения экрана программа работала... Victor[famas] Общие вопросы Delphi 7 13.02.2008 12:48
как сделать так чтобы при открытии второй формы олько она была активной doncova1 Общие вопросы Delphi 2 03.02.2007 19:34