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

Отобразить вектор в обратном порядке не используя реверсивные итераторы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 16:40     Отобразить вектор в обратном порядке не используя реверсивные итераторы #1
Отобразить вектор в обратном порядке не используя реверсивные итераторы

никак не могу в цикле вывести последний(самый первый) элемент
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2012, 16:40     Отобразить вектор в обратном порядке не используя реверсивные итераторы
Посмотрите здесь:

C++ Используя стек ,переписать строку посимвольно в обратном порядке
C++ Вектор и итераторы
Используя стек вывести числа введенные пользователем в обратном порядке элемент стека – число C++
C++ Дан одномерный массив.Не используя других массивов переставить его элементы в обратном порядке.
C++ используя стек распечатать слова в текстовом файле в обратном порядке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
07.08.2012, 16:51     Отобразить вектор в обратном порядке не используя реверсивные итераторы #2
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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main()
{
    vector<int> vi;
    vi.push_back(1);
    vi.push_back(2);
    vi.push_back(3);
    vi.push_back(4);
    vi.push_back(5);
 
    for(vector<int>::const_iterator it = vi.begin(); it != vi.end(); ++it)
        cout << *it << endl;
    cout << "----------" << endl;
 
    reverse(vi.begin(), vi.end());
 
    for(vector<int>::const_iterator it = vi.begin(); it != vi.end(); ++it)
        cout << *it << endl;
 
 
    return 0;
}
не устроит?
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 17:04  [ТС]     Отобразить вектор в обратном порядке не используя реверсивные итераторы #3
C++
1
2
3
4
reverse(vi.begin(), vi.end());
 
    for(vector<int>::const_iterator it = vi.begin(); it != vi.end(); ++it)
        cout << *it << endl;
тут уже получается реверсивный итератор
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
07.08.2012, 17:12     Отобразить вектор в обратном порядке не используя реверсивные итераторы #4
Нет. Тут реверсирован сам вектор, итераторы же - прямые. Реверсивные итераторы - это rbegin() / rend().

Добавлено через 3 минуты
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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main()
{
    vector<int> vi;
    vi.push_back(1);
    vi.push_back(2);
    vi.push_back(3);
    vi.push_back(4);
    vi.push_back(5);
 
    for(vector<int>::const_iterator it = vi.begin(); it != vi.end(); ++it)
        cout << *it << endl;
    cout << "----------" << endl;
 
    for(vector<int>::const_reverse_iterator rit = vi.rbegin(); rit != vi.rend(); ++rit)
        cout << *rit << endl;
    cout << "----------" << endl;
 
    reverse(vi.begin(), vi.end());
    for(vector<int>::const_iterator it = vi.begin(); it != vi.end(); ++it)
        cout << *it << endl;
 
 
    return 0;
}
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 17:30  [ТС]     Отобразить вектор в обратном порядке не используя реверсивные итераторы #5
понял, спасибо
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
07.08.2012, 18:07     Отобразить вектор в обратном порядке не используя реверсивные итераторы #6
CheshireCat, а такой вариант для вектора является приемлемым?

C++
1
2
for(vector<int>::const_iterator it = vi.end() - 1; it >= vi.begin(); --it)
        cout << *it << endl;
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 18:10  [ТС]     Отобразить вектор в обратном порядке не используя реверсивные итераторы #7
Цитата Сообщение от Schizorb Посмотреть сообщение
CheshireCat, а такой вариант для вектора является приемлемым?

C++
1
2
for(vector<int>::const_iterator it = vi.end() - 1; it >= vi.begin(); --it)
        cout << *it << endl;
краш, пробовал уже
Jupiter
07.08.2012, 18:12
  #8

Не по теме:

что за задача в которой нельзя использовать реверсные итераторы?

DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 18:24  [ТС]     Отобразить вектор в обратном порядке не используя реверсивные итераторы #9
Цитата Сообщение от Jupiter Посмотреть сообщение

Не по теме:

что за задача в которой нельзя использовать реверсные итераторы?

2 варианта задачи
условие в заголовке темы
1) решить с реверсивными итераторами
2) тоже самое с использованием обычных итераторов
Миниатюры
Отобразить вектор в обратном порядке не используя реверсивные итераторы  
Арсенал
144 / 66 / 6
Регистрация: 30.12.2011
Сообщений: 137
07.08.2012, 18:28     Отобразить вектор в обратном порядке не используя реверсивные итераторы #10
DaskOFF,

Так не идет?

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
#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
    cout.flush();
 
    vector<int> v_int;
 
    for (int i=0; i<10; i++)
        v_int.push_back(i);
 
    for (size_t i=0; i<v_int.size(); i++)
        cout << v_int.at(i) << ' ';
    cout << endl;
 
    while (!v_int.empty())
    {
        cout << v_int.back() << ' ';
        v_int.pop_back();
    }
    cout << endl;
 
 
    return 0;
}
Вывод послежднего элемента вектора:

C++
1
2
  cout << v_int.back() << ' ';
        v_int.pop_back();
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 18:29  [ТС]     Отобразить вектор в обратном порядке не используя реверсивные итераторы #11
Цитата Сообщение от Арсенал Посмотреть сообщение
DaskOFF,

Так не идет?
надо с использованием итераторов, условия выше на скрине
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
07.08.2012, 18:48     Отобразить вектор в обратном порядке не используя реверсивные итераторы #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
 
int main() {            
 
    std::vector<int> v = {1,2,3,4,5};    
        
//    std::reverse_copy(v.begin(), v.end(), 
//                      std::ostream_iterator<int>(std::cout, "\n"));
                      
    for(auto iter = v.end(); iter != v.begin(); )
        std::cout << *(--iter) << "\n";       
}
Арсенал
144 / 66 / 6
Регистрация: 30.12.2011
Сообщений: 137
07.08.2012, 18:49     Отобразить вектор в обратном порядке не используя реверсивные итераторы #13
Интересное поведение получается

C++
1
2
3
4
5
6
7
8
9
10
vector<int> v_int;
 
    for (int i=0; i<10; i++)
        v_int.push_back(i);
 
    vector<int>::iterator f_it = v_int.begin()-1; слева от первого элемента
    vector<int>::iterator l_it = v_int.end()-1; текущий последний элемент
 
    while (f_it != l_it)
        cout << *l_it-- << ' ';
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
07.08.2012, 18:52     Отобразить вектор в обратном порядке не используя реверсивные итераторы #14
И даже так не катит?
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
#include <iostream>
#include <vector>
#include <stack>
 
int main()
{
  std::vector<int> vec;
  vec.push_back(1);
  vec.push_back(2);
  vec.push_back(3);
  vec.push_back(4);
  vec.push_back(5);
 
  std::stack<int> stack;
  for (std::vector<int>::iterator i = vec.begin();
       i != vec.end();
       ++i)
  {
    stack.push(*i);
  }
  vec.clear();
  while (!stack.empty()) {
    vec.push_back(stack.top());
    stack.pop();
  }
 
  for (std::vector<int>::iterator i = vec.begin();
       i != vec.end();
       ++i)
  {
    std::cout << *i << " ";
  }
  return 0;
}
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 19:02  [ТС]     Отобразить вектор в обратном порядке не используя реверсивные итераторы #15
rangerx, работает, только auto не было в той теме

Добавлено через 3 минуты
Арсенал, крашит

тут вначале решили с помощью реверса вектора, тоже не подходит, этот алгоритм позже проходится

Добавлено через 2 минуты
~OhMyGodSoLong~, тоже самое, что и командой реверс, только переворачиваете вектор с помощью стека
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
07.08.2012, 19:16     Отобразить вектор в обратном порядке не используя реверсивные итераторы #16
Окей. У меня варианты исчерпались.

№ 1: в лоб.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
 
int main()
{
  std::vector<int> vec;
  vec.push_back(1);
  vec.push_back(2);
  vec.push_back(3);
  vec.push_back(4);
  vec.push_back(5);
 
  for (int i = vec.size() - 1; i >= 0; --i) {
    std::cout << vec[i] << " ";
  }
  return 0;
}
№ 2: для извращенцев.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
 
int main()
{
  std::vector<int> vec;
  vec.push_back(1);
  vec.push_back(2);
  vec.push_back(3);
  vec.push_back(4);
  vec.push_back(5);
 
  for (std::vector<int>::iterator last = vec.end(); last != vec.begin();) {
    std::vector<int>::iterator prev = vec.begin();
    for (std::vector<int>::iterator i = vec.begin(); i != last; ++i) {
      prev = i;
    }
    std::cout << *prev << " ";
    last = prev;
  }
  return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2012, 19:24     Отобразить вектор в обратном порядке не используя реверсивные итераторы #17
Для любого STL контейнера.
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
#include <iostream>
#include <vector>
#include <list>
#include <forward_list>
 
template<template<class...> class Container, class... Args>
std::ostream& operator << (std::ostream& os, const Container<Args...>& cont)
{
   auto start = std::begin(cont), end = std::end(cont);
   auto diff = std::distance(start, end);
   for (decltype(diff) i = diff - 1; i >= 0; --i)
   {
      auto it = start;
      std::advance(it, i);
      os << *it << " ";
   }
   os << std::endl;
   return os;
}
 
int main()
{
   std::vector<int> v = {1,2,3,4};
   std::cout << v << std::endl;
   std::list<int> l = {1,2,3,4};
   std::cout << l << std::endl;
   std::forward_list<int> f = {1,2,3,4};
   std::cout << f << std::endl;
}
http://liveworkspace.org/code/7bdb51...3b88d68ff4fa4b

Добавлено через 5 минут
Ну или так. Через итераторы.
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
#include <iostream>
#include <vector>
#include <list>
#include <forward_list>
 
template<class Iterator>
std::ostream& print(std::ostream& os, Iterator start, Iterator end)
{
   auto diff = std::distance(start, end);
   for (decltype(diff) i = diff - 1; i >= 0; --i)
   {
      auto it = start;
      std::advance(it, i);
      os << *it << " ";
   }
   os << std::endl;
   return os;
}
 
int main()
{
   std::vector<int> v = {1,2,3,4};
   print(std::cout, std::begin(v), std::end(v));
   std::list<int> l = {1,2,3,4};
   print(std::cout, std::begin(l), std::end(l));
   std::forward_list<int> f = {1,2,3,4};
   print(std::cout, std::begin(f), std::end(f));
   int a[] = {1,2,3,4};
   print(std::cout, std::begin(a), std::end(a));
}
http://liveworkspace.org/code/009544...8966771e66db08
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 19:30  [ТС]     Отобразить вектор в обратном порядке не используя реверсивные итераторы #18
я решил следующим образом, интересует вариант вывода через цикл for , чтобы первый элемент не приходилось выводить отдельно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
 
int main() {            
 
    std::vector<int> v;    
        for(int i(1);i !=5;i++)
            v.push_back(i);
    
        std::vector<int>::iterator iter = v.end()-1;
 
        while(1) {
            if (iter != v.begin()) {
                std::cout << *iter << " " << std::flush;
                iter--;
            } else {
                std::cout << *iter << " " << std::endl;
                break;
            }
        }
 
        return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
Для любого STL контейнера.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<template<class...> class Container, class... Args>
std::ostream& operator << (std::ostream& os, const Container<Args...>& cont)
{
   auto start = std::begin(cont), end = std::end(cont);
   auto diff = std::distance(start, end);
   for (decltype(diff) i = diff - 1; i >= 0; --i)
   {
      auto it = start;
      std::advance(it, i);
      os << *it << " ";
   }
   os << std::endl;
   return os;
}
такого я еще не знаю


Цитата Сообщение от ForEveR Посмотреть сообщение
C++
1
std::vector<int> v = {1,2,3,4};
по данным строкам мне выдает следующее:
v: инициализация не агрегированных данных с помощью списка инициализации не допускается
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2012, 19:45     Отобразить вектор в обратном порядке не используя реверсивные итераторы #19
DaskOFF, Не сомневаюсь, мне просто было удобнее так писать. Это новый стандарт. Видимо ваш компилятор его еще не полностью поддерживает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2012, 19:47     Отобразить вектор в обратном порядке не используя реверсивные итераторы
Еще ссылки по теме:

Дан одномерный массив. Не используя других массивов, переставить его элементы в обратном порядке C++
C++ Разработать программу для работы с массивами: отобразить в обратном порядке одномерный массив
Не используя других массивов, переставить элементы заданного массива в обратном порядке C++

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

Или воспользуйтесь поиском по форуму:
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
07.08.2012, 19:47  [ТС]     Отобразить вектор в обратном порядке не используя реверсивные итераторы #20
Цитата Сообщение от ForEveR Посмотреть сообщение
DaskOFF, Не сомневаюсь, мне просто было удобнее так писать. Это новый стандарт. Видимо ваш компилятор его еще не полностью поддерживает.
у меня VS 2010
Yandex
Объявления
07.08.2012, 19:47     Отобразить вектор в обратном порядке не используя реверсивные итераторы
Ответ Создать тему
Опции темы

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