Форум программистов, компьютерный форум CyberForum.ru

Удаление парных и не парных елементов в контейнере - C++

Восстановить пароль Регистрация
 
Arderun
1 / 1 / 0
Регистрация: 12.09.2011
Сообщений: 17
17.11.2011, 11:53     Удаление парных и не парных елементов в контейнере #1
Задача на удаление функцией erase() парных и не парных елементов из контейнеров. После компиляции программа на запуске выдает крит expression"this->_Has_container",0). Нюхом чую где-то erase удалять несуществующий элемент пытается но где понять не могу. ошибка точно в цыклах с условием. Проблемныю часть зацытировал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "stdafx.h"
#include <iostream>
#include <sstream>
#include<conio.h>
#include<string>
#include<vector>
#include<list>
#include<Algorithm>
using std::vector;
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::list;
 
int _tmain(int argc, _TCHAR* argv[])
{ int  w, ia[]={0,1,1,2,3,5,8,13,21,55,89};
vector<int> va(ia,ia+11);
list<int> la(ia,ia+11);
for(vector<int>::iterator d=va.begin(); d!=va.end(); ++d)
    {cout << *d << " ";}
cout << endl;
 
for(list<int>::iterator d=la.begin(); d!=la.end(); ++d)
    {cout << *d << " ";}
cout << endl;
 
/*for(vector<int>::iterator d=va.begin(); d<va.end(); ++d)
{if((*d)%2){}
else{va.erase(d);}
}
 
for(list<int>::iterator d=la.begin(); d!=la.end(); ++d)
{if((*d)%2){la.erase(d);}} */
for(vector<int>::iterator d=va.begin(); d!=va.end(); ++d)
{cout << *d << " ";}
cout << endl;
for(list<int>::iterator d=la.begin(); d!=la.end(); ++d)
{cout << *d << " ";}
cout << endl;
 
w=_getch();
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
17.11.2011, 12:03     Удаление парных и не парных елементов в контейнере #2
а в дебаге посмотреть нельзя где выдает ошибку,?
Arderun
1 / 1 / 0
Регистрация: 12.09.2011
Сообщений: 17
17.11.2011, 12:13  [ТС]     Удаление парных и не парных елементов в контейнере #3
ошибки нет есть вылет. его нет ни в условии if ни в работе erase если его вынимать из цикла, ошибка точно в процессе выполнения for(vector<int>::iterator d=va.begin(); d<va.end(); ++d) va.erase(d); просто кусок кода настолько маленький что я не могу увидеть где..
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.11.2011, 12:18     Удаление парных и не парных елементов в контейнере #4
Arderun, При удалении элемента из массива итератор становится некорректным => ++d после erase(d) вызывает ошибку памяти. Либо используйте список, либо пишите d = va.erase(d) и тогда все будет ок.

Добавлено через 1 минуту
Пример.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
 
int main()
{
   std::vector<int> vec = {1,2,3,4,5,6,7,8};
   for (std::vector<int>::iterator iter = vec.begin(); iter != vec.end();)
   {
      if (!(*iter % 2))
      {
         iter = vec.erase(iter);
      }
      else
      {
         ++iter;
      }
   }
}
Arderun
1 / 1 / 0
Регистрация: 12.09.2011
Сообщений: 17
17.11.2011, 12:18  [ТС]     Удаление парных и не парных елементов в контейнере #5
вот! спасибо! забыл забирать итератор у erase.
Yandex
Объявления
17.11.2011, 12:18     Удаление парных и не парных елементов в контейнере
Ответ Создать тему
Опции темы

Текущее время: 14:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru