Вставка в stl list
От: Molchalnik  
Дата: 17.04.11 09:01
Оценка:
Коллеги!!! Я понимаю, что где-то непростительно туплю, но сроки поджимают, а справка по stl не дала ответ.

недавно по работе надо было использовать list. но, такая проблема: у листа begin и end возвращают исключительно const ссылки почему-то, а операции вставки принципиально const ссылки не "едят". каким жутким, ненадёжным и проклятым богами корпоративного программирования я преобразовал константный stl указатель к неконстантному, я умолчу. Но, это же неверно, должен быть естественный способ вставки в stl list. Подскажите, сам понимаю что дурак, теперь только хочу выяснить, ГДЕ
Re: Вставка в stl list
От: GarryIV  
Дата: 17.04.11 09:04
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>Коллеги!!! Я понимаю, что где-то непростительно туплю, но сроки поджимают, а справка по stl не дала ответ.


M>недавно по работе надо было использовать list. но, такая проблема: у листа begin и end возвращают исключительно const ссылки почему-то, а операции вставки принципиально const ссылки не "едят". каким жутким, ненадёжным и проклятым богами корпоративного программирования я преобразовал константный stl указатель к неконстантному, я умолчу. Но, это же неверно, должен быть естественный способ вставки в stl list. Подскажите, сам понимаю что дурак, теперь только хочу выяснить, ГДЕ


http://www.cplusplus.com/reference/stl/list/insert/
WBR, Igor Evgrafov
Re: Вставка в stl list
От: Molchalnik  
Дата: 17.04.11 09:09
Оценка:
уточняю

при попытке использовать конструкцию

vector<type>::iterator referenceT it=indexes.begin();

компилятор пишет:"Cannot convert vector<type>::const_iterator to vector<type>::iterator"

И, что характерно, insert принципиально отказывается работать с vector<type>::const_iterator.

Получается, инсерт есть, а ссылки для инсерта получить невозможно.


Что делать?
Re[2]: Вставка в stl list
От: minorlogic Украина  
Дата: 17.04.11 09:15
Оценка:
vector<double> indexes;
vector<double>::iterator it=indexes.begin();

так компилируется ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Вставка в stl list
От: Molchalnik  
Дата: 17.04.11 09:16
Оценка:
Здравствуйте, GarryIV, Вы писали:

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


GIV>http://www.cplusplus.com/reference/stl/list/insert/


Спасибо, но я знаком с этой и другими справками по 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;
    }
}


выводит сообщение о том, что невозможно преобразовать константный указатель к неконстантному.

в этом и проблема.
Re[3]: Вставка в stl list
От: minorlogic Украина  
Дата: 17.04.11 09:20
Оценка:
Здравствуйте, Molchalnik, Вы писали:


M>

M>typedef list<sometype> ReferenceT; 
// typedef list<sometype>::iterator ReferenceT; 

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>в этом и проблема.

И не должен , в приведенном коде синтаксическая ошибка
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: Вставка в stl list
От: Molchalnik  
Дата: 17.04.11 09:20
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>vector<double> indexes;

M>vector<double>::iterator it=indexes.begin();

M>так компилируется ?



не знаю, так как заменить в большом проекте тип на double я не могу

код такой



typedef list<sometype>::iterator 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;
    }
}


sometype=unsigned __int16
Re[4]: Вставка в stl list
От: minorlogic Украина  
Дата: 17.04.11 09:22
Оценка: 3 (2) +2
Здравствуйте, Molchalnik, Вы писали:

M>код такой

M>

M>typedef list<sometype>::iterator ReferenceT;

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>sometype=unsigned __int16


Поработаю телепатом ... Это код из константного метода класса где мембер indexes ? или indexes пришел в функцию по константной ссылке ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: Вставка в stl list
От: Molchalnik  
Дата: 17.04.11 09:27
Оценка:
Здравствуйте, minorlogic, Вы писали:

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



M>>

M>>typedef list<sometype> ReferenceT; 
M>// typedef list<sometype>::iterator ReferenceT; 

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>И не должен , в приведенном коде синтаксическая ошибка


Это просто очепятка, я извиняюсь. В коде всё верно, и всё равно не работает

typedef unsigned __int32 uint;
typedef list<sometype>::iterator ReferenceT; 
typedef list<sometype>::const_iterator ConstReferenceT; 

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;
    }
}


Если строчку


ReferenceT it=indexes.begin();

заменить на

ConstReferenceToDotT it=indexes.begin();


то всё работает — но вставкой по полученным ссылкам пользоваться уже нельзя
Re[5]: Вставка в stl list
От: Molchalnik  
Дата: 17.04.11 09:45
Оценка:
M>Поработаю телепатом ... Это код из константного метода класса где мембер indexes ? или indexes пришел в функцию по константной ссылке ?

Спасибо, понял где протупил. Действительно, весьма глупо. Да, indexes пришёл по константной ссылке. Точнее, indexes — это класс, который является оболочкой для list, и выдаёт только константные указатели, принципиально, потому что менять list в обход класса запрещено и грозит катастрофой программе. Хорошо, а как тогда построить const-correctness code? делать неконстантную версию begin у indexes — можно тогда сразу на идею const-correctness code забивать и шпарить просто так.

задача такая. list является часть класса, который можно менять только через класс. но позиции для вставки определяются во внешней (относительно класса) функции. можно их задать номером позиции, но тогда скорость вставки значительно упадёт за счёт поиска нужного элемента перебором элементов list. желательно определять ссылку во время поиска, причём по некоторым причинам лучше её дублировать с номером позиции. Что-то пока я не вижу простых способов построить const-correctness code. Разве что начать усложнять — ввести ещё пару интеллектуальных указателей и т.п. Простой способ есть? Что сделать лучше всего?
Re[6]: Вставка в stl list
От: AK1801 Россия  
Дата: 17.04.11 10:13
Оценка:
Здравствуйте, Molchalnik, Вы писали:

M>задача такая. list является часть класса, который можно менять только через класс. но позиции для вставки определяются во внешней (относительно класса) функции. можно их задать номером позиции, но тогда скорость вставки значительно упадёт за счёт поиска нужного элемента перебором элементов list.


1. Может вам стоит здесь дать еще более общий план задачи? И тогда вам, возможно, подскажут более правильное решение, в котором не будет таких сложных задач с точки зр. дизайна и реализации?
2. Опасения по поводу потери скорости — они на самом деле так серьезны? Вы делали замеры, прикидывали? То есть замедление операции вставки так будет заметно в конечном итоге? Или вам кажется, что это будет так ужасно? На сколько процентов просядет общая производительность системы при удвоении времени вставки?
Re[6]: Вставка в stl list
От: ArkM  
Дата: 17.04.11 17:33
Оценка:
Здравствуйте, Molchalnik, Вы писали:


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-функциях.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.