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

С++ для начинающих

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

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

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

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

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

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

Отобразить буквы в обратном порядке - C#
есть определенный порядок букв abcd нужно отобразить их в обратном порядке

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

Как отобразить предложения в обратном порядке? - C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; ...

Получить от пользователя строку и отобразить ее в обратном порядке - C#
Делал задании по книжке. Дошел до одной и никак не могу доделать. Цель: получить от пользователя строку и отображать строку в обратном...

Отобразить в окне консоли аргументы командной строки в обратном порядке - Java SE
отобразить в окне консоли аргументы командной строки в обратном порядке for( int i = args.length - 1 ; i >= 0 ; i--) ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 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
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
112 / 112 / 9
Регистрация: 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: инициализация не агрегированных данных с помощью списка инициализации не допускается
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
07.08.2012, 19:45 #19
DaskOFF, Не сомневаюсь, мне просто было удобнее так писать. Это новый стандарт. Видимо ваш компилятор его еще не полностью поддерживает.
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
07.08.2012, 19:47  [ТС] #20
Цитата Сообщение от ForEveR Посмотреть сообщение
DaskOFF, Не сомневаюсь, мне просто было удобнее так писать. Это новый стандарт. Видимо ваш компилятор его еще не полностью поддерживает.
у меня VS 2010
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
07.08.2012, 19:48 #21
DaskOFF, Списки инициализации она действительно не поддерживает, а вот все остальное, что написано в коде вроде как да.
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
08.08.2012, 08:45 #22
Цитата Сообщение от DaskOFF Посмотреть сообщение
работает, только auto не было в той теме
auto всего лишь позволяет не указывать тип при инициализации переменной, и используется исключительно для удобства. Т.е. вариант с использованием auto
C++
1
2
// неконстантный итератор
for(auto iter = v.end(); iter != v.begin(); )
C++
1
2
// константный итератор
for(auto iter = v.cend(); iter != v.cbegin(); )
с тем же успехом можно переписать и без него
C++
1
for(std::vector<int>::iterator iter = v.end(); iter != v.begin(); )
C++
1
for(std::vector<int>::const_iterator iter = v.end(); iter != v.begin(); )
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
08.08.2012, 11:29  [ТС] #23
Цитата Сообщение от rangerx Посмотреть сообщение
auto всего лишь позволяет не указывать тип при инициализации переменной, и используется исключительно для удобства. Т.е. вариант с использованием auto
C++
1
2
// неконстантный итератор
for(auto iter = v.end(); iter != v.begin(); )
C++
1
2
// константный итератор
for(auto iter = v.cend(); iter != v.cbegin(); )
с тем же успехом можно переписать и без него
C++
1
for(std::vector<int>::iterator iter = v.end(); iter != v.begin(); )
C++
1
for(std::vector<int>::const_iterator iter = v.end(); iter != v.begin(); )
ну в любом случае это не проходилось, значит предполагается другое решение, как я решил, интересует есть ли решение, где не надо выводить первый элемент отдельно
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
08.08.2012, 12:02 #24
Цитата Сообщение от DaskOFF Посмотреть сообщение
ну в любом случае это не проходилось
Повторюсь, использование auto не является принципиальным, тип итератора можно указать явно.
Цитата Сообщение от DaskOFF Посмотреть сообщение
интересует есть ли решение, где не надо выводить первый элемент отдельно
Да, решение находится в 12-ом посте. ))

Добавлено через 50 секунд
http://liveworkspace.org/code/0cf6f1...79f0efdf754801
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2012, 12:02
Привет! Вот еще темы с ответами:

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

Используя стек переписать элементы в обратном порядке - Delphi
Здравствуйте! Помогите пожалуйста со следующим: В Edit записывается любая последовательность букв, их нужно используя стек написать в...

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

Перестановка цифр в числе в обратном порядке (используя цикл while) - PascalABC.NET
Напишите программу для перестановки цифр в числе в обратном порядке, используя цикл while


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.08.2012, 12:02
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru