Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 11
1

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

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

Author24 — интернет-сервис помощи студентам
Почему нужен итератор(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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2016, 15:49
Ответы с готовыми решениями:

Зачем нужен finally, если можно без него?
Если в try возникает исключение, то оно обрабатывается в блоке catch. Но зачем тогда finally?...

Для чего нужен IoC, можно ли обойтись без него
Добрый день! Подскажите пожалуйста для чего нужен IoC, можно ли обойтись без него и полезен или...

Важен ли css файл или же можно обойтись без него ?
Появился интересный для меня вопрос, погулил ничего дельного не нашел, так вот, я сделал сайт из...

Зачем нужен интерфейс, если у него предполагается только одна реализация?
Здравствуйте! Читаю эту статью. Непонятен один момент: Какого черта создается интерфейс, если...

15
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
18.01.2016, 20:51 2
ggorg96, в C++ можно сделать одни и те же вещи массой разных способов. Итераторы нужны, чтобы пользоваться разными вкусными фишками из STL.
2
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
18.01.2016, 20:55 3
Цитата Сообщение от gru74ik Посмотреть сообщение
Итераторы нужны, чтобы пользоваться разными вкусными фишками из STL.
Не только.
Попробуйте обойти "индексами" список или дерево
Итератор - это целый паттерн.
4
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 11
18.01.2016, 22:41  [ТС] 4
Цитата Сообщение от Croessmah Посмотреть сообщение
Попробуйте обойти "индексами" список или дерево
Можете привести пример как обойти дерево

Добавлено через 6 минут
Croessmah, можете привести пример как обойти дерево.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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
0 / 0 / 0
Регистрация: 14.01.2016
Сообщений: 11
19.01.2016, 15:51  [ТС] 6
Croessmah, вы привели пример как обойти список, а можете привести пример как обойти дерево
Цитата Сообщение от Croessmah Посмотреть сообщение
Попробуйте обойти "индексами" список или дерево
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
19.01.2016, 15:58 8
Цитата Сообщение от ggorg96 Посмотреть сообщение
вы привели пример как обойти список
Где здесь список? set - множество, как правило реализуется бинарным деревом.
Если интересны другие варианты, то можете посмотреть в Boost::Graph.
Или граф - это тоже список?
1
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
19.01.2016, 16:05 9
Ан нет, это не неупорядоченный контейнер, ошибочка.

Добавлено через 47 секунд
Наоборот даже, самоупорядочивающийся контейнер.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
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
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
19.01.2016, 20:25 13
Цитата Сообщение от Dimension Посмотреть сообщение
можно сразу
Только auto&, иначе получим копию.
0
163 / 104 / 14
Регистрация: 17.10.2012
Сообщений: 488
19.01.2016, 20:39 14
Благодаря полиморфизму можно создавать функции для работы с коллекциями (контейнерами) независимо от того, какой тип контейнера используется. Та же сортировка работает для любого контейнера. Главное, что бы конкретные типы итераторов поддерживались. Т.е. один интерфейс для различных реализаций.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
19.01.2016, 20:52 15
Croessmah, Даже лучше const auto&, если изменять не требуется. В данном случае просто вывод.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2016, 21:04
Помогаю со студенческими работами здесь

Зачем писать override, если и без него всё работает
Зачем писать override, если и без него всё работает?public class MyBaseClass { public...

Для чего в методе GetAlianswZipCode используется return "440415" и можно ли обойтись без него?
Есть абстрактный класс и наследуемый abstract class Car { public abstract string...

Зачем нужен PaintBox, если рисовать можно на форме ?
Объясните пожалуйста чайнику:)

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru