Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / STL и VC++2005EE / 11 сообщений из 11, страница 1 из 1
31.05.2006, 10:16
    #33762401
kbk
kbk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
Имеется консольное приложение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include "stdafx.h"
#include <vector>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

	vector<int> a;
	vector <int>::iterator i;

	a.push_back( 1 );
	a.push_back( 2 );
	a.push_back( 3 );
        for (i=a.begin(); i!=a.end();) {
          if ((*i)% 2 == 0 ) a.erase(i); else i++;
        }

	return  0 ;
}

Использую компиляторы mingw, BCB, VC++2005EE.
Программы, созданные первыми двумя компиляторами, отрабатывают с одинаковым и предсказуемым результатом.
Программа, созданная VC++2005EE, после выполнения метода erase генерирует исключение "vector iterators incompatible". При этом отладчик (как и в других компиляторах) показывает. что после удаления итератор i указывает на последний элемент вектора.
Хотелось бы знать причину разницы - это недостаток или более правильная реализация STL в VC++2005?
...
Рейтинг: 0 / 0
31.05.2006, 10:43
    #33762516
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
более правильная

23.2.4.3 vector modifiers

iterator erase(iterator position);
iterator erase(iterator first, iterator last);

Effects: Invalidates all the iterator and references after the point of erase.
...
Рейтинг: 0 / 0
01.06.2006, 09:02
    #33764972
kbk
kbk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
Для полноты: ну конечно, надо вместо
Код: plaintext
a.erase(i);
использовать
Код: plaintext
i=a.erase(i);
. Это работает для всех компиляторов.
...
Рейтинг: 0 / 0
07.06.2006, 08:59
    #33776530
kbk
kbk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
И все таки есть ли разумное объяснение тому, что отладчик VC2005 показывает (хотя бы на приведенном выше примере) совершенно идентичную информацию о состоянии итератора i после выполнения "правильного"
Код: plaintext
i=a.erase(i);
и "неправильного"
Код: plaintext
a.erase(i);
операторов?
...
Рейтинг: 0 / 0
07.06.2006, 10:19
    #33776711
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
kbkИ все таки есть ли разумное объяснение тому, что отладчик VC2005 показывает (хотя бы на приведенном выше примере) совершенно идентичную информацию о состоянии итератора i после выполнения "правильного"
Код: plaintext
i=a.erase(i);
и "неправильного"
Код: plaintext
a.erase(i);
операторов?

А ты уверен, что она идентичная? В первом случае итератор, показывать должен на следующий элемент, во втором случае - на уже отсутствующий (виолейшин мемори :) ).

ЗЫ: Может я не прав.
...
Рейтинг: 0 / 0
08.06.2006, 06:58
    #33779318
kbk
kbk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
В том то и дело, что в обоих случаях в отладчике итератор указывает на следующий элемент.
...
Рейтинг: 0 / 0
08.06.2006, 10:06
    #33779590
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
На счет того, на что он указывает.

Сначала надо объяснить следующую ситуацию. Когда он удалил 2-й элемент, он указывает на 3-й. При сравнении с end() будет false. Потом он инкрементируется, но все равно указывает на 3-й (в отладчике), но теперь при сравнении с end() будет true. Вроде бы ничего не изменилось при инкреминтации, но реакция совсем другая. Вполне возможно, что если не присваивать i=a.erase(i), то он "как-то не правельно" указывает, или "где-то чего-то" не отметилось.
...
Рейтинг: 0 / 0
08.06.2006, 10:58
    #33779776
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
Akh
Тему не меняй, да ?

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
08.06.2006, 11:15
    #33779853
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
Карабас Барабас
Тему не меняй, да ?


В каком месте происходит ошибка? а?
...
Рейтинг: 0 / 0
08.06.2006, 11:19
    #33779874
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
AkhВ каком месте происходит ошибка? а?
Твоя ошибка в том, что ты тему поста меняешь
...
Рейтинг: 0 / 0
08.06.2006, 11:42
    #33780001
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
STL и VC++2005EE
Понял. Это не я это Мозила. :)

По теме топика пока мыслев никаких нет.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / STL и VC++2005EE / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]