Итератор для вектора почему лучше использовать ?
От: Аноним  
Дата: 09.02.04 17:00
Оценка:
нежели последовательный переход по нему через цикл указавв переменную vec[i]
Re: Итератор для вектора почему лучше использовать ?
От: Bell Россия  
Дата: 09.02.04 17:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>нежели последовательный переход по нему через цикл указавв переменную vec[i]

В плане эффективности разницы нет. А вот сама работа с итераторами широко используется в самой STL и при программировании с использованием STL. Так что использование итераторов — общепринятый стиль.
Любите книгу — источник знаний (с) М.Горький
Re: Итератор для вектора почему лучше использовать ?
От: Андрей Галюзин Украина  
Дата: 09.02.04 20:21
Оценка:
> нежели последовательный переход по нему через цикл указавв переменную vec[i]

Лучше, пожалуй, применить алгоритм std::for_each.

--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[2]: Итератор для вектора почему лучше использовать ?
От: Bell Россия  
Дата: 10.02.04 07:13
Оценка:
Здравствуйте, Андрей Галюзин, Вы писали:

>> нежели последовательный переход по нему через цикл указавв переменную vec[i]


АГ>Лучше, пожалуй, применить алгоритм std::for_each.


Это очень сильно зависит от характера операций, выполняемых в теле цикла.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Итератор для вектора почему лучше использовать ?
От: Vamp Россия  
Дата: 10.02.04 07:25
Оценка:
АГ>Лучше, пожалуй, применить алгоритм std::for_each.
Отнюдь не все циклические операции с элементами контейнера можно выразить в терминах std::for_each.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Итератор для вектора почему лучше использовать ?
От: WolfHound  
Дата: 10.02.04 07:30
Оценка:
Здравствуйте, Vamp, Вы писали:

АГ>>Лучше, пожалуй, применить алгоритм std::for_each.

V>Отнюдь не все циклические операции с элементами контейнера можно выразить в терминах std::for_each.
Поверь мне все... вопрос лишь в том как это будет выглядить...
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Итератор для вектора почему лучше использовать ?
От: AI Россия  
Дата: 10.02.04 08:27
Оценка:
(имхо)
работа с вектором через итератор более эффетивна (сточки зрения доступа к значеиям)если вся цель заключаеться в последовательном прохождении . но всё зависит от случая применения. к примеру использовать список выгодней вектора в случае когда необходимо удалять или вставлять что то в него при больших записях.
в принципе на старом добром с вызов значния черз индекс массива более медлененн чем через адрес. так что видимо имхо и с векторе имеет аналогичный случай.
Re[2]: Итератор для вектора почему лучше использовать ?
От: SergeMukhin Россия  
Дата: 10.02.04 08:57
Оценка:
Здравствуйте, AI, Вы писали:

AI>(имхо)

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

это устаревшие сведения. доступ по a[i] и *a++ оптимизируются одинаково.
... << RSDN@Home 1.1.0 stable >>
---
С уважением,
Сергей Мухин
Re[4]: Итератор для вектора почему лучше использовать ?
От: Vamp Россия  
Дата: 10.02.04 09:16
Оценка:
WH>Поверь мне все... вопрос лишь в том как это будет выглядить...
Ну вот простой пример:

void f(vector<int>& vec) {
  int arr1[...]={...};
  int arr2[...]={...};
  int arr3[...];

  for(IT i=vec.begin(), e=vec.end(); i!=e; ++i) {
      int idx=e-i;
      
      if (arr1[idx]-arr2[idx]==*it)
         arr3= arr1[idx]*arr2[idx]
      else 
         arr3=arr1[idx]/arr2[idx]
  }
}

Как бы ты реализовал стандартными средствами в сочетании с for_each?
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Итератор для вектора почему лучше использовать ?
От: Vamp Россия  
Дата: 10.02.04 09:19
Оценка:
AI>в принципе на старом добром с вызов значния черз индекс массива более медлененн чем через адрес.
Разве? a[i] эквивалентно *(a+i).
Доказательство:
*(a+i) эквивалентно *(i+a), что в свою очередь эвкивалетно i[a]. И компилятор это подтверждает, компилируя такую конструкцию.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Итератор для вектора почему лучше использовать ?
От: Андрей Галюзин Украина  
Дата: 10.02.04 10:14
Оценка:
>>> нежели последовательный переход по нему через цикл указавв переменную vec[i]

АГ>>Лучше, пожалуй, применить алгоритм std::for_each.


B> Это очень сильно зависит от характера операций, выполняемых в теле цикла.


Да, но в <algorithm> и <numeric> есть много и других алгоритмов

--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[3]: Итератор для вектора почему лучше использовать ?
От: Андрей Галюзин Украина  
Дата: 10.02.04 10:30
Оценка:
AI>>в принципе на старом добром с вызов значния черз индекс массива более медлененн чем через
AI>>адрес.

V> Разве? a[i] эквивалентно *(a+i).

V> Доказательство:
V> *(a+i) эквивалентно *(i+a), что в свою очередь эвкивалетно i[a]. И компилятор это
V> подтверждает, компилируя такую конструкцию.

Это все правильно, но:
  int a[] = { 1, 2, 3,4 ,5 ,6 ,7 ,8 };

  for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
  {
    a[i]; // вычисление *(a.begin() + i)
  }

  int* end = a + sizeof(a) / sizeof(a[0]);
  for (int* i = a; i != end; i++)
  {
    *i; // просто использование указателя
  }


Хотя хорошему оптимизатору вполне по силам сделать из первого варианта второй.

--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[4]: Итератор для вектора почему лучше использовать ?
От: Андрей Галюзин Украина  
Дата: 10.02.04 10:33
Оценка:
В догонку: i++ лучше заменить на ++i, хотя для встроенных типов это и не актуально.

--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[4]: Итератор для вектора почему лучше использовать ?
От: Bell Россия  
Дата: 10.02.04 10:36
Оценка:
Здравствуйте, Андрей Галюзин, Вы писали:

АГ>>>Лучше, пожалуй, применить алгоритм std::for_each.


B>> Это очень сильно зависит от характера операций, выполняемых в теле цикла.


АГ>Да, но в <algorithm> и <numeric> есть много и других алгоритмов


Есть, но твой первый призыв был именно про std::for_each
Любите книгу — источник знаний (с) М.Горький
Re: Итератор для вектора почему лучше использовать ?
От: Libra Россия  
Дата: 10.02.04 10:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>нежели последовательный переход по нему через цикл указавв переменную vec[i]


еще один довод в пользу использования итераторов, явной формулировки которого я что-то не заметил
например, есть вот такой код
typedef std::vector<int> IntSeq;
int sum_iter(const IntSeq &seq)
{
   int sum = 0;
   for(IntSeq::const_iterator it = seq.begin();it != seq.end();++it)
    {
       //работа со значениями последовательности через итератор...
       sum += *it + i;
    }
   return sum;
}

int sum(const IntSeq &seq)
{
   int sum = 0;
   for(int i = 0;i < seq.size();++i)
    {
      //обработка значений последовательности
      sum += seq[i] + i;
    }
   return sum;
}

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

Удачи
Species come and go, but the earth stands forever fast...
Re[4]: Итератор для вектора почему лучше использовать ?
От: Vamp Россия  
Дата: 10.02.04 10:56
Оценка:
АГ>
АГ>  int a[] = { 1, 2, 3,4 ,5 ,6 ,7 ,8 };
...
   a[i]; // вычисление *(a.begin() + i)
...
АГ>

Какой еще a.begin()?
По существу, я имел в виду немного другое.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Итератор для вектора почему лучше использовать ?
От: Артур Россия  
Дата: 10.02.04 11:11
Оценка:
Здравствуйте, WolfHound, Вы писали:


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


АГ>>>Лучше, пожалуй, применить алгоритм std::for_each.

V>>Отнюдь не все циклические операции с элементами контейнера можно выразить в терминах std::for_each.
WH>Поверь мне все... вопрос лишь в том как это будет выглядить...

Если не ошибаюсь, стандартом не гаранированно, что std::for_each будет обрабатывать элементы последовательно и в нужном порядке.
... << RSDN@Home 1.1.0 stable >>
Re[5]: Итератор для вектора почему лучше использовать ?
От: Андрей Галюзин Украина  
Дата: 10.02.04 11:19
Оценка:
АГ>>>>Лучше, пожалуй, применить алгоритм std::for_each.

B>>> Это очень сильно зависит от характера операций, выполняемых в теле цикла.


АГ>>Да, но в <algorithm> и <numeric> есть много и других алгоритмов


B> Есть, но твой первый призыв был именно про std::for_each


Угу, мне показалось, что требуется тривиальная работа. Надо было не поленится и добавить еще пару строчек

--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[5]: Итератор для вектора почему лучше использовать ?
От: Павел Кузнецов  
Дата: 10.02.04 11:22
Оценка: 3 (1)
Здравствуйте, Артур, Вы писали:

А> Если не ошибаюсь, стандартом не гаранированно, что std::for_each будет

А> обрабатывать элементы последовательно и в нужном порядке.

Гарантировано:

25.1.1 For each

template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);

1 Effects: Applies f to the result of dereferencing every iterator in the range
[first, last), starting from first and proceeding to last 1.

Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Итератор для вектора почему лучше использовать ?
От: Андрей Галюзин Украина  
Дата: 10.02.04 11:26
Оценка:
АГ>>
АГ>>  int a[] = { 1, 2, 3,4 ,5 ,6 ,7 ,8 };
V> ...
V>    a[i]; // вычисление *(a.begin() + i)
V> ...
АГ>>


V> Какой еще a.begin()?


Покорнейше прошу прощения
Конечно же, имелось ввиду *(a + i).

--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.