Форум программистов, компьютерный форум CyberForum.ru

Итераторы и обратные итераторы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 5.00
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.10.2010, 19:09     Итераторы и обратные итераторы #1
У вектора есть два типа итераторов, обычные и обратные итераторы произвольного доступа...
Обычные реализовал, осталось обратные. Решил сначала изучить как это примерно работает. Возникло пара вопросов.

Можем ли мы через обратные итераторы вывести последовательность таким образом, и если да, то как:
{1,2,3,4,5};
На экране
1,2,3,4,5

И соответственно обратный вопрос можем ли мы через обычные итераторы вывести последовательность таким образом, и если да, то как:
{1,2,3,4,5};
На экране
5,4,3,2,1

Я имею ввиду не через алгоритмы, а через прямой вывод. Заранее спасибо за ответы

Но судя по моим попыткам прямого вывода и через copy
C++
1
std::copy(Vect.rend(), Vect.rbegin(), std::ostream_iterator<int>(std::cout, " "));
Видимо это невозможно. Да?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2010, 19:09     Итераторы и обратные итераторы
Посмотрите здесь:

Итераторы C++
Итераторы в C++ C++
Итераторы С++ C++
Итераторы C++
итераторы си++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.10.2010, 19:19     Итераторы и обратные итераторы #2
Цитата Сообщение от Lavroff Посмотреть сообщение
Видимо это невозможно. Да?
Ага, так не выйдет.
C++
1
2
for ( std::vector<int>::reverse_iterator i = Vect.rbegin(); i != Vect.rend(); ++i )
  std::cout << *i << ' ';
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.10.2010, 19:21  [ТС]     Итераторы и обратные итераторы #3
easybudda, Как раз так то выйдет.
C++
1
2
    for(std::vector<int>::const_reverse_iterator Iter=Vect.rbegin(); Iter!=Vect.rend(); ++Iter)
        std::cout<<*Iter<<' ';
Выводит последовательность в обратном порядке. Т.к. ++Iter реализован как --Iter

MSVS
C++
1
2
3
4
5
6
7
8
9
10
11
12
    _Myt& __CLR_OR_THIS_CALL operator++()
        {   // preincrement
        --current;
        return (*this);
        }
 
    _Myt __CLR_OR_THIS_CALL operator++(int)
        {   // postincrement
        _Myt _Tmp = *this;
        --current;
        return (_Tmp);
        }
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.10.2010, 19:29     Итераторы и обратные итераторы #4
Цитата Сообщение от Lavroff Посмотреть сообщение
Как раз так то выйдет.
я про
Цитата Сообщение от Lavroff Посмотреть сообщение
std::copy(Vect.rend(), Vect.rbegin(), std::ostream_iterator<int>(std::cout, " "));
говорил, что не выйдет. А так, как написал, работает.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.10.2010, 19:30  [ТС]     Итераторы и обратные итераторы #5
easybudda, Извиняюсь) Неверно понял мысль
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
14.10.2010, 20:48     Итераторы и обратные итераторы #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну, поскольку обратный итератор является адаптером прямого, т.е. тем же классом прямого итератора, только с измененным интерфейсом, то возможности у них одинаковы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <vector>
 
typedef  std::vector<int>  T_nums;
 
int main()
{
    std::locale::global(std::locale(""));
    T_nums  nums;
    nums.push_back(1);
    nums.push_back(2);
    nums.push_back(3);
    nums.push_back(4);
    nums.push_back(5);
 
    std::cout << "Вывод обратным итератором:"
              << std::endl;
    for(T_nums::reverse_iterator  rev_it = nums.rend(); rev_it != nums.rbegin();
        --rev_it)
    {
        std::cout << *(rev_it - 1)
                  << std::endl;
    }
 
    std::cout << std::endl
              << "Вывод прямым итератором:"
              << std::endl;
    for(T_nums::iterator  it = nums.end(); it != nums.begin();
        --it)
    {
        std::cout << *(it - 1)
                  << std::endl;
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2010, 21:36     Итераторы и обратные итераторы
Еще ссылки по теме:

итераторы C++
C++ Итераторы
Потоковые и обратные итераторы C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.10.2010, 21:36  [ТС]     Итераторы и обратные итераторы #7
Mr.X, Спасибо. Заодно с помощью этого теста нашел пару багов в своих обратных итераторах.

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

C++
1
        Lst [0]()   std::vector<int,Allocator<int> >
Вместо

C++
1
    Vec {Alloc={...} Arr=0xcccccccc Size=3435973836 ...}    Vector<int,Allocator<int> >
Если да, то как. Поподробнее пожалуйста. Что-то я дико подозреваю, что нужны какие-то мутки с базовым классом для контейнера... Но могу быть и не прав. Подскажите плиз.
Yandex
Объявления
14.10.2010, 21:36     Итераторы и обратные итераторы
Ответ Создать тему
Опции темы

Текущее время: 20:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru