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

Вывод элементов вектора - C++

Восстановить пароль Регистрация
 
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
24.10.2011, 09:22     Вывод элементов вектора #1
почему когда выводим данные вектора пишем так:
C++
1
for (vector<RecVecR>::iterator p =vecR.begin() ; p != vecR.end();p++)
а если надо вывести список наоборот то:
C++
1
for (vector<RecVecR>::iterator p =vecR.end()-1 ; p != vecR.begin()-1;p--)
откуда -1 появляются?
почему не так
C++
1
for (vector<RecVecR>::iterator p =vecR.end() ; p != vecR.begin();p--)
?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2011, 09:22     Вывод элементов вектора
Посмотрите здесь:

Вывод вектора C++
C++ Вывод вектора ax+b
Размер вектора и вывод элементов C++
C++ Вывод вектора
C++ Вывод вектора (vector)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
24.10.2011, 09:28     Вывод элементов вектора #2
Цитата Сообщение от ht1515 Посмотреть сообщение
а если надо вывести список наоборот то
то используй reverse_iterator
Bers
Заблокирован
24.10.2011, 09:44     Вывод элементов вектора #3
Цитата Сообщение от ht1515 Посмотреть сообщение
откуда -1 появляются?
почему не так

Цитата Сообщение от ht1515 Посмотреть сообщение
vecR.end()
Указывает на последний элемент+1.

То бишь, итератор на элемент, находящийся вне диапазона массива.

Array [begin; end)

Теперь гляньте внимательно на строчку кода, и найдите в ней ошибку:

Цитата Сообщение от ht1515 Посмотреть сообщение
for (vector<RecVecR>::iterator p =vecR.begin() ; p != vecR.end();p++)
gogajeti
4 / 4 / 0
Регистрация: 19.10.2011
Сообщений: 20
24.10.2011, 09:47     Вывод элементов вектора #4
насколько я знаю, begin() указывает на первый элемент в векторе, в то время как end() указывает на то что находится после последнего элемента.

а вообще да, лучше использовать reverse_iterator
Bers
Заблокирован
24.10.2011, 09:51     Вывод элементов вектора #5
Цитата Сообщение от gogajeti Посмотреть сообщение
лучше использовать reverse_iterator
Использовать это одно. Совсем другое дело, что прежде чем юзать инструмент, нужно изучить его документацию, что бы понимать такие вещи:

Цитата Сообщение от gogajeti Посмотреть сообщение
begin() указывает на первый элемент в векторе, в то время как end() указывает на то что находится после последнего элемента.
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
24.10.2011, 10:19  [ТС]     Вывод элементов вектора #6
Bers, всмысле так что ли
C++
1
for (vector<RecVecR>::iterator p =vecR.begin() ; p < vecR.end();p++)
не совсем понял
Теперь гляньте внимательно на строчку кода, и найдите в ней ошибку
Bers
Заблокирован
24.10.2011, 10:26     Вывод элементов вектора #7
Цитата Сообщение от ht1515 Посмотреть сообщение
for (vector<RecVecR>::iterator p =vecR.begin() ; p != vecR.end();p++)
Последняя итерация цикла сработает, когда p==vecR.end()

p в этот момент будит указывать на элемент за пределами диапазона вектора. попытка получить доступ к объекту через такой итератор - "неизвестное поведение" (udefined behavior)
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
24.10.2011, 10:37  [ТС]     Вывод элементов вектора #8
Bers, брр, вообще-то нет. Ну я в отладке посмотрел даже...
у меня например 2 элемента в векторе, он 2 и обработает. А по вашей теории 3 должен. Чего не происходит. Сначала происходит видимо p++, а потом уже сравнение
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.10.2011, 10:47     Вывод элементов вектора #9
Bers, Гон.
Bers
Заблокирован
24.10.2011, 10:54     Вывод элементов вектора #10
прошу прощения. Цикл оборвется, когда p станет равным vecR.end()
Условие продолжения цикла - p должно быть не равно vecR.end()

Добавлено через 1 минуту
Цитата Сообщение от ht1515 Посмотреть сообщение
for (vector<RecVecR>::iterator p =vecR.end() ; p != vecR.begin();p--)
здесь же стартовый p уже указывает на элемент выходящий за пределы диапазона.
Что означает "неизвестное поведение" (udefined behavior)

for (vector<RecVecR>::iterator p =vecR.end()-1 ; p != vecR.begin();p--)

Стартовый p будит указывать на последний элемент
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
24.10.2011, 10:59  [ТС]     Вывод элементов вектора #11
C++
1
for (vector<RecVecR>::iterator p =vecR.end()-1 ; p != vecR.begin();p--)
в этом случае vecR.begin() не выведется
reverse_iterator я начал юзать уже. Так по ГОСТУ просто и ладно. Сразу лучше делать буду по правилам.
Bers
Заблокирован
24.10.2011, 11:03     Вывод элементов вектора #12
Цитата Сообщение от ht1515 Посмотреть сообщение
for (vector<RecVecR>::iterator p =vecR.end()-1 ; p != vecR.begin();p--)
for (vector<RecVecR>::iterator p =vecR.end()-1 ; p >vecR.begin()-1;p--)


Цитата Сообщение от ht1515 Посмотреть сообщение
reverse_iterator я начал юзать уже. Так по ГОСТУ просто и ладно. Сразу лучше делать буду по правилам.
Работает и ладно. А понимать принцип работы совсем не обязательно.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.10.2011, 12:46     Вывод элементов вектора #13
Цитата Сообщение от ht1515 Посмотреть сообщение
а если надо вывести список наоборот то:
Быдлокод.
C++
1
for (std::vector<int>::reverse_iterator it = arr.rbegin(); it < arr.rend(); ++it) //...
Незачем велосипед изобретать.
Ну это если просто перебрать все элементы в обратном порядке, если нужно применить какой-то алгоритм(в данном случае копирование),
то имхо плоский стиль предпочтительнее.
C++
1
std::copy( arr.rbegin(), arr.rend(), std::ostream_iterator<int> (std::cout, " ") );
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
24.10.2011, 16:10  [ТС]     Вывод элементов вектора #14
diagon,
в данном случае , я как понимаю,
C++
1
2
++it
it++
можно писать хоть как.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.10.2011, 16:12     Вывод элементов вектора #15
ht1515, Зачем копию создавать лишнюю?
ht1515
шарпопочитатель
 Аватар для ht1515
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 889
24.10.2011, 18:05  [ТС]     Вывод элементов вектора #16
ht1515, Зачем копию создавать лишнюю?
копию чего?
про пересобирание вектора через копирование не я говорил
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.10.2011, 18:12     Вывод элементов вектора #17
Цитата Сообщение от ht1515 Посмотреть сообщение
в данном случае , я как понимаю,
++it
it++
можно писать хоть как.
писать-то можно, но нежелательно
it++ постикремент работает так - копируется текущее значение, текущее значение увеличивается на еденицу, возвращается сделаная копия
++it работает так - увеличивается текущее значение и возвращается ссылка на него
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2011, 18:39     Вывод элементов вектора
Еще ссылки по теме:

C++ Вывод вектора
Вывод вектора указателей C++
C++ Шаблон вывод вектора

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

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.10.2011, 18:39     Вывод элементов вектора #18
Цитата Сообщение от ht1515 Посмотреть сообщение
про пересобирание вектора через копирование не я говорил
При чем здесь пересобирание?
Просто все элементы из диапазона [vec.rbegin(); vec.rend() ) копируются в ostream_iterator, который выводит их на экран.
При постфиксном инкременте должна создаваться дополнительная сущность, что замедляет время работы. По хорошему компилятор это дело должен соптимизировать, но надежнее писать префиксный.
Yandex
Объявления
24.10.2011, 18:39     Вывод элементов вектора
Ответ Создать тему
Опции темы

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