Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Сделал для себя маленькое и приятное открытие — в STL из VS2008 basic_string::erase(first,last) оформлен как КД>
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>В старом STL, из BCB5, используются неконстантные итераторы. КД>Видать "кто-то" допетрил, что это лишнее
И кстати, в VS2005 — тоже неконстантные итераторы. Гы.
Как я удачно это дело обнаружил
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>И ведь действительно — почему бы и нет? Тем более что это упрощает жизнь в некоторых случаях.
Что-то я навскидку не вижу преимуществ Метод собираемся вызывать неконстантный, значит под руками неконстантный контейнер, и получить неконстантные итераторы не составляет труда...
Здравствуйте, Bell, Вы писали:
КД>>И ведь действительно — почему бы и нет? Тем более что это упрощает жизнь в некоторых случаях.
B>Что-то я навскидку не вижу преимуществ Метод собираемся вызывать неконстантный, значит под руками неконстантный контейнер, и получить неконстантные итераторы не составляет труда...
1. неконстантный контейнер
2. перебор элементов с использованием алгоритмов, которые требуют константные итераторы по указателю или ссылке
3. на основе результатов этих алгоритмов нужно удалять элементы из контейнера
--- Как результат
1. Перебираем элементы с применением константных итераторов
2. Передаем в erase эти самые констатные итераторы.
--- Конкретный пример
Есть текст запроса: "select .... from .... where column1=:param1 and column2=:param2"
Нужно param1 и param2 заменить на "?": "select .... from .... where column1=? and column2=?"
Есть утилиты, которые делают выборку именованного параметра
bool get_named_param(/*in-out*/const_iterator& beg,/*in*/const_iterator end,/*out*/string& Name)
Ну а дальше — все как я описал в 1-3
Эти утилиты юзаются еще в другом месте, где ничего не меняется — только сканируется изначально константная строка.
Вообще конечно, все эти примеры ... ну да ладно. Можно было работать в 1-3 и с неконстантным итератором. В STL из VS2008 iterator наследует const_iterator, поэтому по ссылке/указателю передается без проблем.
BCB5 (хотя и юзает для итераторов строки голые char*/const char*) тоже без проблем передает "char*" в "const char*&". Но не может передать "char**" в параметр "const char**".
Вообщем, я подумал — надо нечто, что без проблем будет без проблем собираться под разыми STL/комиляторами. И тут я обнаружил то, о чем написал в самом начале. И узрел я спасение от своих терзаний
Здравствуйте, Bell, Вы писали:
B>Что-то я навскидку не вижу преимуществ Метод собираемся вызывать неконстантный, значит под руками неконстантный контейнер, и получить неконстантные итераторы не составляет труда...
Иногда бывает по-другому: итераторы получили из константных методов, а потом приходим в неконстантный метод для того, чтобы удалить элементы под этими итераторами, у нас ничего не получается
Здравствуйте, uzhas, Вы писали:
U>Иногда бывает по-другому: итераторы получили из константных методов, а потом приходим в неконстантный метод для того, чтобы удалить элементы под этими итераторами, у нас ничего не получается
Спасибо, что помог сформулировать данную мысль
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Привет всем.
КД>Сделал для себя маленькое и приятное открытие — в STL из VS2008 basic_string::erase(first,last) оформлен как КД>
КД>У std::vector — сделано аналогично.
КД>И ведь действительно — почему бы и нет? Тем более что это упрощает жизнь в некоторых случаях.
КД>Надо будет такое в собственных контейнерах тоже реализовать
КД>--- КД>А что по этому поводу говорит современный стандарт C++?
It is the constness of the container which should control whether it can be modified through a member function such as erase(), not the constness of the iterators. The iterators only serve to give positioning information.
Here's a simple and typical example problem which is currently very difficult or impossible to solve without the change proposed below.
Wrap a standard container C in a class W which allows clients to find and read (but not modify) a subrange of (C.begin(), C.end()]. The only modification clients are allowed to make to elements in this subrange is to erase them from C through the use of a member function of W.
...
Proposed resolution:
...
Update the following signatures in 21.4.6.5 [string::erase]:
iterator erase(const_iterator const_position);
iterator erase(const_iterator first, const_iterator last);
...
The LWG believes that this issue should be considered as part of a general review of const issues for the next revision of the standard.