Коллеги!!! Я понимаю, что где-то непростительно туплю, но сроки поджимают, а справка по stl не дала ответ.
недавно по работе надо было использовать list. но, такая проблема: у листа begin и end возвращают исключительно const ссылки почему-то, а операции вставки принципиально const ссылки не "едят". каким жутким, ненадёжным и проклятым богами корпоративного программирования я преобразовал константный stl указатель к неконстантному, я умолчу. Но, это же неверно, должен быть естественный способ вставки в stl list. Подскажите, сам понимаю что дурак, теперь только хочу выяснить, ГДЕ
Здравствуйте, Molchalnik, Вы писали:
M>Коллеги!!! Я понимаю, что где-то непростительно туплю, но сроки поджимают, а справка по stl не дала ответ.
M>недавно по работе надо было использовать list. но, такая проблема: у листа begin и end возвращают исключительно const ссылки почему-то, а операции вставки принципиально const ссылки не "едят". каким жутким, ненадёжным и проклятым богами корпоративного программирования я преобразовал константный stl указатель к неконстантному, я умолчу. Но, это же неверно, должен быть естественный способ вставки в stl list. Подскажите, сам понимаю что дурак, теперь только хочу выяснить, ГДЕ
Спасибо, но я знаком с этой и другими справками по STL, и если бы они могли ответить на мой вопрос, я бы не задал бы его здесь.
Если вы не очень внимательно читали мой вопрос, посмотрите, я написал уточнение.
код по образцу того примера, который приводится по данной ссылке, ПРИ ВСЁМ УВАЖЕНИИ к Вам и этой справке (очень её люблю и постоянно пользуюсь), не работает.
если вам интересно, код такого типа:
typedef list<sometype> ReferenceT;
ReferenceT it=indexes.begin();
//ConstReferenceToDotT it=indexes.begin();
uint p=0;
for (;it!=indexes.end();it++,p++)
{
if (*it==dot)
{
result.Set(it,p);
break;
}
}
выводит сообщение о том, что невозможно преобразовать константный указатель к неконстантному.
M>ReferenceT it=indexes.begin();
M>//ConstReferenceToDotT it=indexes.begin();
M>uint p=0;
M>for (;it!=indexes.end();it++,p++)
M>{
M> if (*it==dot)
M> {
M> result.Set(it,p);
M> break;
M> }
M>}
M>
M>выводит сообщение о том, что невозможно преобразовать константный указатель к неконстантному. M>в этом и проблема.
И не должен , в приведенном коде синтаксическая ошибка
M>>ReferenceT it=indexes.begin();
M>>//ConstReferenceToDotT it=indexes.begin();
M>>uint p=0;
M>>for (;it!=indexes.end();it++,p++)
M>>{
M>> if (*it==dot)
M>> {
M>> result.Set(it,p);
M>> break;
M>> }
M>>}
M>>
M>>выводит сообщение о том, что невозможно преобразовать константный указатель к неконстантному. M>>в этом и проблема.
M>И не должен , в приведенном коде синтаксическая ошибка
Это просто очепятка, я извиняюсь. В коде всё верно, и всё равно не работает
M>Поработаю телепатом ... Это код из константного метода класса где мембер indexes ? или indexes пришел в функцию по константной ссылке ?
Спасибо, понял где протупил. Действительно, весьма глупо. Да, indexes пришёл по константной ссылке. Точнее, indexes — это класс, который является оболочкой для list, и выдаёт только константные указатели, принципиально, потому что менять list в обход класса запрещено и грозит катастрофой программе. Хорошо, а как тогда построить const-correctness code? делать неконстантную версию begin у indexes — можно тогда сразу на идею const-correctness code забивать и шпарить просто так.
задача такая. list является часть класса, который можно менять только через класс. но позиции для вставки определяются во внешней (относительно класса) функции. можно их задать номером позиции, но тогда скорость вставки значительно упадёт за счёт поиска нужного элемента перебором элементов list. желательно определять ссылку во время поиска, причём по некоторым причинам лучше её дублировать с номером позиции. Что-то пока я не вижу простых способов построить const-correctness code. Разве что начать усложнять — ввести ещё пару интеллектуальных указателей и т.п. Простой способ есть? Что сделать лучше всего?
Здравствуйте, Molchalnik, Вы писали:
M>задача такая. list является часть класса, который можно менять только через класс. но позиции для вставки определяются во внешней (относительно класса) функции. можно их задать номером позиции, но тогда скорость вставки значительно упадёт за счёт поиска нужного элемента перебором элементов list.
1. Может вам стоит здесь дать еще более общий план задачи? И тогда вам, возможно, подскажут более правильное решение, в котором не будет таких сложных задач с точки зр. дизайна и реализации?
2. Опасения по поводу потери скорости — они на самом деле так серьезны? Вы делали замеры, прикидывали? То есть замедление операции вставки так будет заметно в конечном итоге? Или вам кажется, что это будет так ужасно? На сколько процентов просядет общая производительность системы при удвоении времени вставки?
M>>Поработаю телепатом ... Это код из константного метода класса где мембер indexes ? или indexes пришел в функцию по константной ссылке ?
M>Спасибо, понял где протупил. Действительно, весьма глупо. Да, indexes пришёл по константной ссылке. Точнее, indexes — это класс, который является оболочкой для list, и выдаёт только константные указатели, принципиально, потому что менять list в обход класса запрещено и грозит катастрофой программе. Хорошо, а как тогда построить const-correctness code? делать неконстантную версию begin у indexes — можно тогда сразу на идею const-correctness code забивать и шпарить просто так.
M>задача такая. list является часть класса, который можно менять только через класс. но позиции для вставки определяются во внешней (относительно класса) функции. можно их задать номером позиции, но тогда скорость вставки значительно упадёт за счёт поиска нужного элемента перебором элементов list. желательно определять ссылку во время поиска, причём по некоторым причинам лучше её дублировать с номером позиции. Что-то пока я не вижу простых способов построить const-correctness code. Разве что начать усложнять — ввести ещё пару интеллектуальных указателей и т.п. Простой способ есть? Что сделать лучше всего?
Если уж list-элемент можно менять только через интерфейс класса, с какой стати кто-то извне определяет, куда в него что-то надо вставлять? Зачем вообще этот list известен кому-то вне класса?
То есть дизайн уже нарушил все правила const-correctness. Почки уже отвалились...
А если const-функции хотят получать и оставлять в объекте что-то оптимизационное, не нарушая принцип внешней константности — для таких дел есть словечко mutable. Для mutable контейнеров можно получать неконстантные итераторы и в const-функциях.