может ли vector::erase(it1, it2)/erase(it1) вернуть не it1?
От: _Winnie Россия C++.freerun
Дата: 29.07.05 12:55
Оценка:
сабж.
Правильно работающая программа — просто частный случай Undefined Behavior
Re: может ли vector::erase(it1, it2)/erase(it1) вернуть не i
От: MaximE Великобритания  
Дата: 29.07.05 13:06
Оценка:
_Winnie wrote:

Он возвращает не it1. http://www.sgi.com/tech/stl/Sequence.html

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[2]: может ли vector::erase(it1, it2)/erase(it1) вернуть н
От: _Winnie Россия C++.freerun
Дата: 29.07.05 13:09
Оценка:
Здравствуйте, MaximE, Вы писали:
ME>_Winnie wrote:
ME>Он возвращает не it1. http://www.sgi.com/tech/stl/Sequence.html


int main()
{
    int a[3] = { 1, 2, 3 };
    std::vector<int> v(a, a+3);

    std::vector<int>::iterator it = v.begin()+1;

    assert (it == v.erase(it));
}


Я спрашиваю не про sequence, а про std::vector.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: может ли vector::erase(it1, it2)/erase(it1) вернуть н
От: _Winnie Россия C++.freerun
Дата: 29.07.05 13:11
Оценка:
Здравствуйте, _Winnie, Вы писали:

пришел к выводу, что все таки не может. Просто сейчас пишу свой контейнер.
Правильно работающая программа — просто частный случай Undefined Behavior
Re: может ли vector::erase(it1, it2)/erase(it1) вернуть не i
От: Bell Россия  
Дата: 29.07.05 13:16
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>сабж.


Конечно.
Другое дело, что на практике наверняка результат erase и it1 будут совпадать. В частности, это справедливо, если итератор вектора — тайпдеф указателя. Если же итератор — "полноценный" класс, то на эту особенность полагаться совсем не стоит.
Любите книгу — источник знаний (с) М.Горький
Re[3]: может ли vector::erase(it1, it2)/erase(it1) вернуть н
От: loki1000 Украина  
Дата: 29.07.05 13:16
Оценка:
Здравствуйте, _Winnie, Вы писали:

std::vector::end() ?
Re[3]: может ли vector::erase(it1, it2)/erase(it1) вернуть н
От: MaximE Великобритания  
Дата: 29.07.05 13:18
Оценка:
_Winnie wrote:

> Здравствуйте, MaximE, Вы писали:

> ME>_Winnie wrote:
> ME>Он возвращает не it1. http://www.sgi.com/tech/stl/Sequence.html

[]

> Я спрашиваю не про sequence, а про std::vector.


A vector is a Sequence. http://www.sgi.com/tech/stl/Vector.html

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[2]: может ли vector::erase(it1, it2)/erase(it1) вернуть н
От: MaximE Великобритания  
Дата: 29.07.05 13:25
Оценка: 1 (1)
Bell wrote:

> Конечно.

> Другое дело, что на практике наверняка результат erase и it1 будут совпадать. В частности, это справедливо, если итератор вектора — тайпдеф указателя. Если же итератор — "полноценный" класс, то на эту особенность полагаться совсем не стоит.

К тому времени, как vector::erase отработал, it1 уже невалидный итератор, поэтому сравнение его с чем угодно не имеет смысла.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[4]: может ли vector::erase(it1, it2)/erase(it1) вернуть н
От: _Winnie Россия C++.freerun
Дата: 29.07.05 13:28
Оценка: :)
Здравствуйте, MaximE, Вы писали:

>> Я спрашиваю не про sequence, а про std::vector.


ME>A vector is a Sequence. http://www.sgi.com/tech/stl/Vector.html

Я знаю. Я спрашиваю не про sequence, а про std::vector.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: может ли vector::erase(it1, it2)/erase(it1) вернуть н
От: _Winnie Россия C++.freerun
Дата: 29.07.05 13:29
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>К тому времени, как vector::erase отработал, it1 уже невалидный итератор, поэтому сравнение его с чем угодно не имеет смысла.


Почему невалидный? Разве erase может инвалидировать итератор?
Правильно работающая программа — просто частный случай Undefined Behavior
Re[4]: может ли vector::erase(it1, it2)/erase(it1) вернуть н
От: _Winnie Россия C++.freerun
Дата: 29.07.05 13:31
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Почему невалидный? Разве erase может инвалидировать итератор?

Уточню. std::vector<>::erase
Правильно работающая программа — просто частный случай Undefined Behavior
Re[5]: может ли vector::erase(it1, it2)/erase(it1) вернуть н
От: _Winnie Россия C++.freerun
Дата: 29.07.05 13:34
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>>Почему невалидный? Разве erase может инвалидировать итератор?

_W>Уточню. std::vector<>::erase

Понял. формально по стандарту итераторы на все, что после стираемого элемента включительно(или не включительно? стандарта под рукой нет), инвалидируются. Так что формально it, наверное тоже инвалидирован. Вроде, ясно.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: может ли vector::erase(it1, it2)/erase(it1) вернуть н
От: Bell Россия  
Дата: 29.07.05 13:41
Оценка:
Здравствуйте, MaximE, Вы писали:


ME>К тому времени, как vector::erase отработал, it1 уже невалидный итератор, поэтому сравнение его с чем угодно не имеет смысла.


Так с этим никто не спорит. Просто в некоторых реализациях (когда итератор — это обычный указатель) переданное и возвращенное значения вполне могут совпадать. ИМХО это и побудило _Winnie задать этот вопрос. Я так понимаю, коллега пытается сэкономить на писанине:
вместо

vector<>::iterator it_new = v.erase(it1);
//используем it_new

писать

v.erase(it1);
//продолжаем использовать it1


Но, конечно, я могу и ошибаться
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.