powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / STL и VC++2005EE
11 сообщений из 11, страница 1 из 1
STL и VC++2005EE
    #33762401
kbk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kbk
Гость
Имеется консольное приложение:
Код: 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
STL и VC++2005EE
    #33762516
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
более правильная

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
STL и VC++2005EE
    #33764972
kbk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kbk
Гость
Для полноты: ну конечно, надо вместо
Код: plaintext
a.erase(i);
использовать
Код: plaintext
i=a.erase(i);
. Это работает для всех компиляторов.
...
Рейтинг: 0 / 0
STL и VC++2005EE
    #33776530
kbk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kbk
Гость
И все таки есть ли разумное объяснение тому, что отладчик VC2005 показывает (хотя бы на приведенном выше примере) совершенно идентичную информацию о состоянии итератора i после выполнения "правильного"
Код: plaintext
i=a.erase(i);
и "неправильного"
Код: plaintext
a.erase(i);
операторов?
...
Рейтинг: 0 / 0
STL и VC++2005EE
    #33776711
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kbkИ все таки есть ли разумное объяснение тому, что отладчик VC2005 показывает (хотя бы на приведенном выше примере) совершенно идентичную информацию о состоянии итератора i после выполнения "правильного"
Код: plaintext
i=a.erase(i);
и "неправильного"
Код: plaintext
a.erase(i);
операторов?

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

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

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

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


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

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


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