Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
ggorg96
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 11
1

Зачем нужен iterator, если можно обойтись без него?

18.01.2016, 15:49. Просмотров 783. Ответов 15
Метки нет (Все метки)

Почему нужен итератор(iterator) если этот код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include<iterator>
using namespace std;
int main()
{
vector<int> the_vector;
vector<int>::iterator the_iterator;
    for (int i=0; i < 10; i++) {
        the_vector.push_back(i);
    }
    int total = 0;
    the_iterator = the_vector.begin();
    while (the_iterator != the_vector.end()) {
      total += *the_iterator++; 
    }
    cout << "suma= " << total << endl;
    return 0;
}
можно написать так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include<iterator>
using namespace std;
int main()
{
vector<int> the_vector;
    for (int i=0; i < 10; i++) 
    {
        the_vector.push_back(i);
    }
    int total = 0;
    for (int i=0; i < 10; i++) 
    {
            total +=the_vector[i];
    }
    cout << "suma= " << total << endl;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2016, 15:49
Ответы с готовыми решениями:

можно ли обойтись без IF ?
Нужно заполнить с главного массива(mas_g) один массив(mas1) елементы с чётными...

Можно ли обойтись без mutex?
в оф мануале : говориться что данные будут появляться то так то эдак...

Можно ли обойтись без разыменования адресов на элементы
Вот куски кода (полный код тут): // Double Bitset 85 bitset&lt;ULONG_MAX&gt;...

Для чего нужен возвращаемый тип в перегрузке ввода >> и почему без него него выдаётся ошибка?
Для чего нужен возвращаемый тип в перегрузке ввода &gt;&gt;, какую роль он выполняет...

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять?
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного -...

15
sourcerer
Модератор
Эксперт CЭксперт С++
4868 / 2053 / 325
Регистрация: 20.02.2013
Сообщений: 5,556
Записей в блоге: 24
Завершенные тесты: 1
18.01.2016, 20:51 2
ggorg96, в C++ можно сделать одни и те же вещи массой разных способов. Итераторы нужны, чтобы пользоваться разными вкусными фишками из STL.
2
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
18.01.2016, 20:55 3
Цитата Сообщение от gru74ik Посмотреть сообщение
Итераторы нужны, чтобы пользоваться разными вкусными фишками из STL.
Не только.
Попробуйте обойти "индексами" список или дерево
Итератор - это целый паттерн.
4
ggorg96
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 11
18.01.2016, 22:41  [ТС] 4
Цитата Сообщение от Croessmah Посмотреть сообщение
Попробуйте обойти "индексами" список или дерево
Можете привести пример как обойти дерево

Добавлено через 6 минут
Croessmah, можете привести пример как обойти дерево.
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
18.01.2016, 22:41 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <set>
#include <cstdlib>
 
int main()
{
    std::set<int> st ;
    for(size_t i = 0 ; i < 10 ; ++i)
        st.insert(rand()%90+10) ;
    for(std::set<int>::const_iterator it = st.begin() ; it != st.end() ; ++it)
        std::cout << *it << ' ' ;
}
1
ggorg96
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 11
19.01.2016, 15:51  [ТС] 6
Croessmah, вы привели пример как обойти список, а можете привести пример как обойти дерево
Цитата Сообщение от Croessmah Посмотреть сообщение
Попробуйте обойти "индексами" список или дерево
0
GbaLog-
Любитель чаепитий
3167 / 1473 / 465
Регистрация: 24.08.2014
Сообщений: 5,207
Записей в блоге: 1
Завершенные тесты: 2
19.01.2016, 15:56 7
ggorg96, Насколько я помню, у set нету оператора прямого доступа.

Добавлено через 1 минуту
Потому что это неупорядоченный контейнер.

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <set>
#include <cstdlib>
 
int main()
{
    std::set<int> st ;
    for(size_t i = 0 ; i < 10 ; ++i)
        st.insert(rand()%90+10) ;
    cout << st[0]; // ошибка, нету такого оператора!
}
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
19.01.2016, 15:58 8
Цитата Сообщение от ggorg96 Посмотреть сообщение
вы привели пример как обойти список
Где здесь список? set - множество, как правило реализуется бинарным деревом.
Если интересны другие варианты, то можете посмотреть в Boost::Graph.
Или граф - это тоже список?
1
GbaLog-
Любитель чаепитий
3167 / 1473 / 465
Регистрация: 24.08.2014
Сообщений: 5,207
Записей в блоге: 1
Завершенные тесты: 2
19.01.2016, 16:05 9
Ан нет, это не неупорядоченный контейнер, ошибочка.

Добавлено через 47 секунд
Наоборот даже, самоупорядочивающийся контейнер.
0
Kastaneda
Jesus loves me
Эксперт С++
4943 / 3020 / 346
Регистрация: 12.12.2009
Сообщений: 7,622
Записей в блоге: 2
Завершенные тесты: 1
19.01.2016, 16:14 10
Цитата Сообщение от ggorg96 Посмотреть сообщение
Можете привести пример как обойти дерево
В том то и фишка итераторов. Пример обхода вектора
C++
1
2
3
for (auto it = vector.begin(); it != vector.end(); it++) {
    // ...
}
Пример обхода дерева
C++
1
2
3
for (auto it = tree.begin(); it != tree.end(); it++) {
    // ...
}
0
Dimension
Dimension
573 / 443 / 221
Регистрация: 08.04.2014
Сообщений: 1,709
Завершенные тесты: 1
19.01.2016, 20:09 11
можно сразу
C++
1
2
3
4
for(auto it:vector)
 //..
for(auto it:tree)
 //..
0
Kastaneda
19.01.2016, 20:18
  #12

Не по теме:

Цитата Сообщение от Dimension Посмотреть сообщение
можно сразу
да, просто это скрывает использование итераторов от глаз тех, кто не в курсе что там внутри. Поэтому я специально пример с итераторами показал.

0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
19.01.2016, 20:25 13
Цитата Сообщение от Dimension Посмотреть сообщение
можно сразу
Только auto&, иначе получим копию.
0
iRomul
159 / 100 / 14
Регистрация: 17.10.2012
Сообщений: 483
Завершенные тесты: 1
19.01.2016, 20:39 14
Благодаря полиморфизму можно создавать функции для работы с коллекциями (контейнерами) независимо от того, какой тип контейнера используется. Та же сортировка работает для любого контейнера. Главное, что бы конкретные типы итераторов поддерживались. Т.е. один интерфейс для различных реализаций.
0
GbaLog-
Любитель чаепитий
3167 / 1473 / 465
Регистрация: 24.08.2014
Сообщений: 5,207
Записей в блоге: 1
Завершенные тесты: 2
19.01.2016, 20:52 15
Croessmah, Даже лучше const auto&, если изменять не требуется. В данном случае просто вывод.
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
19.01.2016, 21:04 16
makfak, в цикле Kastaneda не указал какие операции проводятся.
в случае auto it = vector.begin() it будет константным,
если константен сам вектор и не константным, если вектор не константный.
Тоже самое и при for(auto& e:vector), а вот при const auto& мы насильно пихаем const.


P.S. разницу между 'it' и 'e' опустил для простоты.
0
19.01.2016, 21:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2016, 21:04

Зачем нужен тип private, если есть protected?
зачем нужен тип private если есть protected??? одного не достаточно? ведь...

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

Зачем вообще нужно слово NULL если можно просто написать 0?
Для чего нужны все эти слова как например NULL, EOF? Вместо них можно просто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru