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

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

Страниц: [1] 2 3 ... 8   Вниз
  Печать  
Автор Тема: Итераторы  (Прочитано 44674 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Апрель 12, 2013, 09:32 »

Добрый день

Неоднократно высказывалось мнение что использование итераторов - это круто, грамотно и все такое. Я лично этого мнения не разделяю и при первой возможности использую незатейливый оператор [] (ну конечно для контейнеров прямого доступа). На мой взгляд это короче и яснее. Аргументация в пользу итераторов не кажется мне убедительной -  обычно приводятся примеры которые можно делать как угодно. А давайте возьмем задачку "чуть выше травы".

Код
C++ (Qt)
std::vector <QPoint3D> mPoint;  // котейнер точек
typedef int Triangle[3];
std::vector <Triangle> mTriangle;  // контейнер треугольников
 
Каждый Triangle хранит 3 индекса в контейнере mPoint, напр первый (0, 10, 15) и.т.д.
Теперь пользователь каким-то образом выбрал несколько точек (известны их индексы) и заказал их удаление. Ну конечно надо не только замочить их в контейнере mPoint но и отредактировать mTriangle

Прошу показать богатырскую силу итераторов на этом простом примере  Улыбающийся

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

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Апрель 12, 2013, 09:53 »

Прошу показать богатырскую силу итераторов на этом простом примере  Улыбающийся
Вы как всегда в крайности. Улыбающийся

Аргументация в пользу итераторов не кажется мне убедительной -  обычно приводятся примеры которые можно делать как угодно.
Какая нужна аргументация, если при последовательном перемещении по контейнеру с использованием индекса необходимо на каждой итерации вычислять эффективный адрес элемента, а итератор просто делает ++/-- указателя?

А давайте возьмем задачку "чуть выше травы".
Все как всегда. Задача точно подобрана. Улыбающийся

Каждый Triangle хранит 3 индекса в контейнере mPoint, напр первый (0, 10, 15) и.т.д.
Давайте мы не будем хранить индексы. Улыбающийся А то тут на нужен random-access к коллекции, а итераторы здесь как козе баян.

Итераторы лучше и эффективней для последовательного доступа к коллекции. Кстати, значения printfом мы печатали доставая их, как раз, последовательно. Подмигивающий
« Последнее редактирование: Апрель 12, 2013, 10:09 от Old » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #2 : Апрель 12, 2013, 09:56 »

Неоднократно высказывалось мнение что использование итераторов - это круто, грамотно и все такое.
Вы все напутали ! Грамотное использование итераторов - это круто, и все такое.  Веселый
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #3 : Апрель 12, 2013, 10:59 »

О господи... Igors объявил войну итераторам))

https://www.youtube.com/watch?v=LcS5HR4w4Hg

или это?

http://www.youtube.com/watch?v=Z6yP1huFq48

Вспомнилось вот)
« Последнее редактирование: Апрель 12, 2013, 11:11 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #4 : Апрель 12, 2013, 11:35 »

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

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Апрель 12, 2013, 11:46 »

а я вот начал ваять нечто, но все заглохло на инициализации массива треугольников.
Кто-то может выдать рабочий код для добавления треугольников в массив ?  Шокированный

Новый стандарт есть? Улыбающийся
Код
C++ (Qt)
std::vector <Triangle> mTriangle = { { 1, 2, 3 }, {4, 5, 6 } };
 
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #6 : Апрель 12, 2013, 12:17 »

Новый стандарт есть? Улыбающийся
Толи лыжи не едут, толи ...  http://liveworkspace.org/code/cIG2U$4
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #7 : Апрель 12, 2013, 12:40 »

Толи лыжи не едут, толи ...  http://liveworkspace.org/code/cIG2U$4

Код
C++ (Qt)
typedef std::array<int, 3> Triangle;
 
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #8 : Апрель 12, 2013, 12:41 »

Код
C++ (Qt)
typedef std::array<int, 3> Triangle;
 
так я тоже умею  Смеющийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #9 : Апрель 12, 2013, 12:44 »

так я тоже умею  Смеющийся
А с сишным не взлетает. Улыбающийся
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #10 : Апрель 12, 2013, 12:51 »

Код
C++ (Qt)
   int arr[10][3] = { {1, 2, 3 }, {4, 5, 6 }, {}, {}, {}, {}, {}, {}, {}, {} };  
  std::vector<std::array<int,3>> tr = { {1, 2, 3 }, {4, 5, 6 }, {}, {}, {}, {}, {}, {}, {}, {} };
массив массивов и вектор массивов работают, вектор с простыми массивами не работает  Шокированный
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #11 : Апрель 12, 2013, 13:11 »

Код
C++ (Qt)
   int arr[10][3] = { {1, 2, 3 }, {4, 5, 6 }, {}, {}, {}, {}, {}, {}, {}, {} };  
  std::vector<std::array<int,3>> tr = { {1, 2, 3 }, {4, 5, 6 }, {}, {}, {}, {}, {}, {}, {}, {} };
массив массивов и вектор массивов работают, вектор с простыми массивами не работает  Шокированный

Да, не, нормально там всё работает)
Для таких вложенных конструкций надо писать так:
Код
C++ (Qt)
std::vector<std::array<int,3>> tr = { {{1, 2, 3 }}, {{4, 5, 6 }} };
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #12 : Апрель 12, 2013, 13:26 »

Какая нужна аргументация, если при последовательном перемещении по контейнеру с использованием индекса необходимо на каждой итерации вычислять эффективный адрес элемента, а итератор просто делает ++/-- указателя?

думаю, что в наилучшем случае для итератора i++ (инкремент индекса) будет на пару тактов быстрее, чем ++iter (инкремент итератора). Но это экономия на спичках, и вопрос в принципе несущественный.
« Последнее редактирование: Апрель 12, 2013, 14:41 от Alex Custov » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #13 : Апрель 12, 2013, 13:35 »

думаю, что в наилучшем случае для итератора i++ (инкремент индекса) будет на пару тактов быстрее, чем ++iter. Но это экономия на спичках, и вопрос в принципе несущественный.
http://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i-in-c
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #14 : Апрель 12, 2013, 13:39 »

Да, не, нормально там всё работает)
Там-то нормально, ты попробуй что-то сделать с
Код
C++ (Qt)
typedef int Triangle[3];
std::vector <Triangle> mTriangle;  // контейнер треугольников
Записан
Страниц: [1] 2 3 ... 8   Вверх
  Печать  
 
Перейти в:  


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