Russian Qt Forum
Октябрь 01, 2024, 02:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Константный итератор вместо обычного. Чистый С++  (Прочитано 14074 раз)
fisenkdima
Гость
« : Ноябрь 18, 2013, 15:12 »

На код ниже компилятор выдаёт ошибку:
Код:
std::list<std::pair<unsigned int, int> > headIndexes;
headIndexes.push_back( std::make_pair( 0, -1 ) );
std::list<std::pair<unsigned int, int> >::iterator iter = headIndexes.end();
--iter;

ошибка: conversion from 'std::list<std::pair<unsigned int, int> >::const_iterator {aka std::_List_const_iterator<std::pair<unsigned int, int> >}'
to non-scalar type 'std::list<std::pair<unsigned int, int> >::iterator {aka std::_List_iterator<std::pair<unsigned int, int> >}' requested
std::list<std::pair<unsigned int, int> >::iterator iter = headIndexes.end();
                                                                                                ^
Я понимаю, что std::list::end() возвращает константный итератор, и что я не могу присваивать его обычному итератору.

Как заставить этот метод вернуть обычный итератор? Метод ведь перегруженный, и существует нужная мне версия.

mingw 4.8, QTCreator, QT 5.1.1.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #1 : Ноябрь 18, 2013, 16:44 »

нужно больше подробностей, у меня код нормально компилируется.
Код
C++ (Qt)
   class test
   {
   public:
       void test_1() const
       {
           std::list<std::pair<unsigned int, int> > headIndexes;
           headIndexes.push_back( std::make_pair( 0, -1 ) );
           std::list<std::pair<unsigned int, int> >::iterator iter = headIndexes.end();
           --iter;
       }
   };
 
   test t;
   t.test_1();
Записан
fisenkdima
Гость
« Ответ #2 : Ноябрь 18, 2013, 16:53 »

Больше подробностей... Это можно.

https://github.com/Dalidul/FSAT/blob/lazy/headtailliteral.h
https://github.com/Dalidul/FSAT/blob/lazy/headtailliteral.cpp

в файле .срр строчки 67 и 81.

А на основании чего делается выбор между перегруженными версиями метода? Не из типа переменной, в которую мы хотим сохранить результат?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Ноябрь 18, 2013, 16:59 »

Дело происходит в константном методе, поэтому все константное.
Записан
mutineer
Гость
« Ответ #4 : Ноябрь 18, 2013, 17:03 »

Дело происходит в константном методе, поэтому все константное.

Как все? Даже локальные переменные? Странно...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Ноябрь 18, 2013, 17:05 »

Как все? Даже локальные переменные? Странно...
Почему локальные? Итератор конструируется для члена класса.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #6 : Ноябрь 18, 2013, 17:07 »

Дело происходит в константном методе, поэтому все константное.
А  как же мой тестовый код?
Записан
fisenkdima
Гость
« Ответ #7 : Ноябрь 18, 2013, 17:07 »

Дело происходит в константном методе, поэтому все константное.

Истину говорите, сенсей.
Спасибо. Я бы не догадался.
Записан
fisenkdima
Гость
« Ответ #8 : Ноябрь 18, 2013, 17:08 »

Дело происходит в константном методе, поэтому все константное.
А  как же мой тестовый код?

В тестовом коде переменная, которая создает итератор - локальная.
Записан
mutineer
Гость
« Ответ #9 : Ноябрь 18, 2013, 17:14 »

Как все? Даже локальные переменные? Странно...
Почему локальные? Итератор конструируется для члена класса.


А, строчкой выше создается другой лист, точно
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Ноябрь 18, 2013, 17:18 »

Указатель на список delta лучше сразу делать умным, а не при выходе из метода.
Что-бы сразу исключить любые утечки памяти.
Записан
fisenkdima
Гость
« Ответ #11 : Ноябрь 18, 2013, 17:24 »

Указатель на список delta лучше сразу делать умным, а не при выходе из метода.
Что-бы сразу исключить любые утечки памяти.

Принято. Вот только намного ли замедлится операция разыменования, при учёте, что мы будем делать её ооочень много раз (я имею ввиду не конкретно в данном методе, а вообще, если вдруг будет стоять выбор между умным и обычным указателем в критично важном для быстродействия блоке кода)?

Я ещё не вполне разобрался с тем, как правильно (а вернее, когда правильно) ловить исключения, которые могут возникнуть при нехватке кучи.
« Последнее редактирование: Ноябрь 18, 2013, 17:28 от fisenkdima » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Ноябрь 18, 2013, 17:28 »

Тут не только в исключениях дело, вы можете добавить в дальнейшем выход из метода, где то по середине и забыть удалять этот список руками. А умный указатель будет это делать сам.
Записан
fisenkdima
Гость
« Ответ #13 : Ноябрь 18, 2013, 17:29 »

Тут не только в исключениях дело, вы можете добавить в дальнейшем выход из метода, где то по середине и забыть удалять этот список руками. А умный указатель будет это делать сам.

Да, это я понял.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Ноябрь 18, 2013, 17:40 »

А вы напишите маленький тест и все увидите сами. Улыбающийся
Ничтожное (хотя я сомневаюсь что вы его заметите) снижение производительности на разименование никак не может сравниться с удобством и эффективностью умных указателей.
Ну тесты и профилировщик это все скажет и без меня. Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.202 секунд. Запросов: 23.