113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
1

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

07.08.2012, 16:40. Показов 18162. Ответов 23
Метки нет (Все метки)

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

никак не могу в цикле вывести последний(самый первый) элемент
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2012, 16:40
Ответы с готовыми решениями:

Не могу создать вектор, используя потоковые итераторы напрямую
#include <iostream> #include <vector> #include <algorithm> #include <iterator> #include...

Отобразить десятичное целое число в обратном порядке следования цифр
решение на C++ кто знает (Отображение целого числа в обратном порядке) Напишите функцию со...

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

Используя стек ,переписать строку посимвольно в обратном порядке
Используя стек ,переписать строку посимвольно в обратном порядке!!!!!!!!!!!

23
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
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;
}
не устроит?
1
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 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;
тут уже получается реверсивный итератор
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
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;
}
1
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
07.08.2012, 17:30  [ТС] 5
понял, спасибо
0
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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;
1
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 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;
краш, пробовал уже
1
Jupiter
07.08.2012, 18:12
  #8

Не по теме:

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

0
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
07.08.2012, 18:24  [ТС] 9
Цитата Сообщение от Jupiter Посмотреть сообщение

Не по теме:

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

2 варианта задачи
условие в заголовке темы
1) решить с реверсивными итераторами
2) тоже самое с использованием обычных итераторов
Миниатюры
Отобразить вектор в обратном порядке не используя реверсивные итераторы  
0
145 / 67 / 14
Регистрация: 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();
0
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
07.08.2012, 18:29  [ТС] 11
Цитата Сообщение от Арсенал Посмотреть сообщение
DaskOFF,

Так не идет?
надо с использованием итераторов, условия выше на скрине
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
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";       
}
1
145 / 67 / 14
Регистрация: 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-- << ' ';
1
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 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;
}
1
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
07.08.2012, 19:02  [ТС] 15
rangerx, работает, только auto не было в той теме

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

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

Добавлено через 2 минуты
~OhMyGodSoLong~, тоже самое, что и командой реверс, только переворачиваете вектор с помощью стека
0
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 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;
}
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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/... d68ff4fa4b

Добавлено через 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/... 771e66db08
1
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 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: инициализация не агрегированных данных с помощью списка инициализации не допускается
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
07.08.2012, 19:45 19
DaskOFF, Не сомневаюсь, мне просто было удобнее так писать. Это новый стандарт. Видимо ваш компилятор его еще не полностью поддерживает.
0
113 / 113 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
07.08.2012, 19:47  [ТС] 20
Цитата Сообщение от ForEveR Посмотреть сообщение
DaskOFF, Не сомневаюсь, мне просто было удобнее так писать. Это новый стандарт. Видимо ваш компилятор его еще не полностью поддерживает.
у меня VS 2010
0
07.08.2012, 19:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2012, 19:47
Помогаю со студенческими работами здесь

Напечатать в обратном порядке заданный текст используя рекурсию
Напечатать в обратном порядке заданный текст, используя рекурсию.

Используя рекурсию напечатать вводимые числа в обратном порядке
1. Написать рекурсивную процедуру, которая считывает вводимые с клавиатуры числа до тех пор, пока...

Используя стек, отобразить файл посимвольно в обратном порядке
Дан текстовый файл. Используя стек, отобразите его посимвольно в обратном порядке. Знаки...

Отобразить слова в обратном порядке
я ввожу несколько слов через пробел он мне их должен вывести их в том же порядке, но только в...


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

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

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