Здравствуйте, Аноним, Вы писали:
А>нежели последовательный переход по нему через цикл указавв переменную vec[i]
В плане эффективности разницы нет. А вот сама работа с итераторами широко используется в самой STL и при программировании с использованием STL. Так что использование итераторов — общепринятый стиль.
Любите книгу — источник знаний (с) М.Горький
Re: Итератор для вектора почему лучше использовать ?
Здравствуйте, Андрей Галюзин, Вы писали:
>> нежели последовательный переход по нему через цикл указавв переменную vec[i]
АГ>Лучше, пожалуй, применить алгоритм std::for_each.
Это очень сильно зависит от характера операций, выполняемых в теле цикла.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Итератор для вектора почему лучше использовать ?
АГ>Лучше, пожалуй, применить алгоритм std::for_each.
Отнюдь не все циклические операции с элементами контейнера можно выразить в терминах std::for_each.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Итератор для вектора почему лучше использовать ?
Здравствуйте, Vamp, Вы писали:
АГ>>Лучше, пожалуй, применить алгоритм std::for_each. V>Отнюдь не все циклические операции с элементами контейнера можно выразить в терминах std::for_each.
Поверь мне все... вопрос лишь в том как это будет выглядить...
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Итератор для вектора почему лучше использовать ?
(имхо)
работа с вектором через итератор более эффетивна (сточки зрения доступа к значеиям)если вся цель заключаеться в последовательном прохождении . но всё зависит от случая применения. к примеру использовать список выгодней вектора в случае когда необходимо удалять или вставлять что то в него при больших записях.
в принципе на старом добром с вызов значния черз индекс массива более медлененн чем через адрес. так что видимо имхо и с векторе имеет аналогичный случай.
Re[2]: Итератор для вектора почему лучше использовать ?
Здравствуйте, AI, Вы писали:
AI>(имхо) AI>работа с вектором через итератор более эффетивна (сточки зрения доступа к значеиям)если вся цель заключаеться в последовательном прохождении . но всё зависит от случая применения. к примеру использовать список выгодней вектора в случае когда необходимо удалять или вставлять что то в него при больших записях. AI>в принципе на старом добром с вызов значния черз индекс массива более медлененн чем через адрес. так что видимо имхо и с векторе имеет аналогичный случай.
это устаревшие сведения. доступ по a[i] и *a++ оптимизируются одинаково.
... << RSDN@Home 1.1.0 stable >>
---
С уважением,
Сергей Мухин
Re[4]: Итератор для вектора почему лучше использовать ?
AI>в принципе на старом добром с вызов значния черз индекс массива более медлененн чем через адрес.
Разве? a[i] эквивалентно *(a+i).
Доказательство:
*(a+i) эквивалентно *(i+a), что в свою очередь эвкивалетно i[a]. И компилятор это подтверждает, компилируя такую конструкцию.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Итератор для вектора почему лучше использовать ?
>>> нежели последовательный переход по нему через цикл указавв переменную vec[i]
АГ>>Лучше, пожалуй, применить алгоритм std::for_each.
B> Это очень сильно зависит от характера операций, выполняемых в теле цикла.
Да, но в <algorithm> и <numeric> есть много и других алгоритмов
--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[3]: Итератор для вектора почему лучше использовать ?
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]: Итератор для вектора почему лучше использовать ?
Здравствуйте, Андрей Галюзин, Вы писали:
АГ>>>Лучше, пожалуй, применить алгоритм std::for_each.
B>> Это очень сильно зависит от характера операций, выполняемых в теле цикла.
АГ>Да, но в <algorithm> и <numeric> есть много и других алгоритмов
Есть, но твой первый призыв был именно про std::for_each
Любите книгу — источник знаний (с) М.Горький
Re: Итератор для вектора почему лучше использовать ?
Здравствуйте, Аноним, Вы писали:
А>нежели последовательный переход по нему через цикл указавв переменную 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]: Итератор для вектора почему лучше использовать ?
WH>Здравствуйте, Vamp, Вы писали:
АГ>>>Лучше, пожалуй, применить алгоритм std::for_each. V>>Отнюдь не все циклические операции с элементами контейнера можно выразить в терминах std::for_each. WH>Поверь мне все... вопрос лишь в том как это будет выглядить...
Если не ошибаюсь, стандартом не гаранированно, что std::for_each будет обрабатывать элементы последовательно и в нужном порядке.
... << RSDN@Home 1.1.0 stable >>
Re[5]: Итератор для вектора почему лучше использовать ?
АГ>>>>Лучше, пожалуй, применить алгоритм std::for_each.
B>>> Это очень сильно зависит от характера операций, выполняемых в теле цикла.
АГ>>Да, но в <algorithm> и <numeric> есть много и других алгоритмов
B> Есть, но твой первый призыв был именно про std::for_each
Угу, мне показалось, что требуется тривиальная работа. Надо было не поленится и добавить еще пару строчек
--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[5]: Итератор для вектора почему лучше использовать ?
Здравствуйте, Артур, Вы писали:
А> Если не ошибаюсь, стандартом не гаранированно, что 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]: Итератор для вектора почему лучше использовать ?
Покорнейше прошу прощения
Конечно же, имелось ввиду *(a + i).
--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[5]: Итератор для вектора почему лучше использовать ?
От:
Аноним
Дата:
10.02.04 11:33
Оценка:
Здравствуйте, Vamp, Вы писали:
WH>>Поверь мне все... вопрос лишь в том как это будет выглядить... V>Ну вот простой пример:
V>
V>void f(vector<int>& vec) {
V> int arr1[...]={...};
V> int arr2[...]={...};
V> int arr3[...];
V> for(IT i=vec.begin(), e=vec.end(); i!=e; ++i) {
V> int idx=e-i;
V> if (arr1[idx]-arr2[idx]==*it)
V> arr3= arr1[idx]*arr2[idx]
V> else
V> arr3=arr1[idx]/arr2[idx]
V> }
V>}
V>
V>Как бы ты реализовал стандартными средствами в сочетании с for_each?
А как насчет функиональных классов.
Напишу конструктор и переопределю оператор ().
for_each не пригоден только в одном случае, если нужно гарантированно выйти из цикла и вернуть значение предиката, а не просто ни чего не делать до канца прохода. Я видел как это легко обошли введя простой алгорит for_each_if, find_if неподходил т.к. возвращает итератор, а не значение предиката.
Re[2]: Итератор для вектора почему лучше использовать ?
L> typedef std::vector<int> IntSeq;
L> int sum_iter(const IntSeq &seq)
L> {
L> int sum = 0;
L> for(IntSeq::const_iterator it = seq.begin();it != seq.end();++it)
L> {
L> //работа со значениями последовательности через итератор...
L> sum += *it + i;
L> }
L> return sum;
L> }
L>
А еще к ним [итераторам] можно применять алгоритмы
#include <numeric>
....
int sum = std::accumulate(seq.begin() , seq.end () , 0);
L> и тут из соображений эффективности или еще каких-либо соображений, решили заменить L> контейнер std::vector на тот же самый std::list. Как ты считаешь, для какой функции не нужно будет делать никаких изменений? L> А ведь таких кусков, различной сложности может быть очень много...
Очень редко удается заменить контейнер одим мановением руки. Обычно все равно приходится проводить ревизию всего кода и
модифицировать алгоритмы (собственные, конечно . Подробнее о причинах этого "безобразия" можно прочесть в "Effective STL" Майерса.
--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[6]: Итератор для вектора почему лучше использовать ?
А>Напишу конструктор и переопределю оператор ().
И? У тебя в этот оператор будет попадать разыменованный итератор. А в моем примере нужно иметь сам итератор для того, чтобы посчитать индекс.
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Итератор для вектора почему лучше использовать ?
WH>А кто говорил про стандартные?
Я говорил про стандартные
А этот твой страшный код — уж лучше цикл, как мне кажется.
Я даже не могу проверить, то ли он делает
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Итератор для вектора почему лучше использовать ?
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, Артур, Вы писали:
А>> Если не ошибаюсь, стандартом не гаранированно, что 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.
Мнда, ошибка вышла.
... << RSDN@Home 1.1.0 stable >>
Re[3]: Итератор для вектора почему лучше использовать ?