В астрале
Эксперт С++
8048 / 4805 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
1

Итераторы и обратные итераторы

14.10.2010, 19:09. Показов 7480. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У вектора есть два типа итераторов, обычные и обратные итераторы произвольного доступа...
Обычные реализовал, осталось обратные. Решил сначала изучить как это примерно работает. Возникло пара вопросов.

Можем ли мы через обратные итераторы вывести последовательность таким образом, и если да, то как:
{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, " "));
Видимо это невозможно. Да?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2010, 19:09
Ответы с готовыми решениями:

Потоковые и обратные итераторы
В MSDN написано:&quot;Существующие контейнеры стандартной библиотеки шаблонов также задают типы...

C++: итераторы по умолчанию, пустые итераторы, end()
Всем добра! Вопрос на тему итераторов в плюсах: 1. какие значения имеют итераторы без...

Итераторы в C++
Помогите плз решить 2 задачи Задача 1 Напишите программу, использующую итераторы при чтении...

Итераторы
Добрый день! Начал изучать классы в C++ параллельно с итераторами. Решил сделать простенькую...

6
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11894 / 7266 / 1721
Регистрация: 25.07.2009
Сообщений: 13,302
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 << ' ';
0
В астрале
Эксперт С++
8048 / 4805 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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);
        }
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11894 / 7266 / 1721
Регистрация: 25.07.2009
Сообщений: 13,302
14.10.2010, 19:29 4
Цитата Сообщение от Lavroff Посмотреть сообщение
Как раз так то выйдет.
я про
Цитата Сообщение от Lavroff Посмотреть сообщение
std::copy(Vect.rend(), Vect.rbegin(), std::ostream_iterator<int>(std::cout, " "));
говорил, что не выйдет. А так, как написал, работает.
0
В астрале
Эксперт С++
8048 / 4805 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
14.10.2010, 19:30  [ТС] 5
easybudda, Извиняюсь) Неверно понял мысль
0
Эксперт С++
3222 / 1749 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
14.10.2010, 20:48 6
Лучший ответ Сообщение было отмечено ForEveR как решение

Решение

Ну, поскольку обратный итератор является адаптером прямого, т.е. тем же классом прямого итератора, только с измененным интерфейсом, то возможности у них одинаковы.
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;
    }
}
1
В астрале
Эксперт С++
8048 / 4805 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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> >
Если да, то как. Поподробнее пожалуйста. Что-то я дико подозреваю, что нужны какие-то мутки с базовым классом для контейнера... Но могу быть и не прав. Подскажите плиз.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2010, 21:36
Помогаю со студенческими работами здесь

Итераторы С++
Как с помощью итераторов работать с массивом объектов класса? И что такое класс Итератор? П.С. Не...

Итераторы С++
Помогите, пожалуйста, надо написать две программы Задача 1 Напишите программу, использующую...

Итераторы
Как указать не на следующий за последним элемент последовательности, а на последний! end() -...

Итераторы
От какого класса наследуются итераторы в STL? Например я создаю класс и для него нужен...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru