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

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

Войти
Регистрация
Восстановить пароль
 
 
ht1515
шарпопочитатель
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 956
#1

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

24.10.2011, 09:22. Просмотров 1054. Ответов 17
Метки нет (Все метки)

почему когда выводим данные вектора пишем так:
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++
Объясните почему в функции print размер передаваемого вектора v.size()=0? Соответсвенно не работает цикл for в print(). #include...

Найти сколько элементов первого вектора совпадают с элементами второго вектора - C++
#include &lt;iostream&gt; #include &lt;time.h&gt; #include &lt;vector&gt; #include &lt;set&gt; using namespace std; void main() { ...

Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5) - C++
Ребята помогите пожалуйста с задачкой. Я сам не шарю в C++, но в этом семестре появился этот предмет! И завтра его надо будет сдать :( Буду...

Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А - C++
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А на начало, а...

Составить главную программу и функцию. Для данного вектора А(М) найти количество неповторяющихся элементов вектора - C++
Здравствуйте. Буду очень благодарен,если кто нибудь напишет два кода к этим задачам. Спасибо за внимание. Задача 1. Составить...

Заданы три вектора a(n), b(m), c(k). Вывести наименование вектора, в котором максимальна сумма четных элементов, стоящих на нечетных местах - C++
Заданы три вектора a(n), b(m), c(k). Вывести наименование вектора, в котором максимальна сумма четных элементов, стоящих на нечетных...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
PointsEqual
ниначмуроФ
834 / 518 / 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
шарпопочитатель
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 956
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
шарпопочитатель
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 956
24.10.2011, 10:37  [ТС] #8
Bers, брр, вообще-то нет. Ну я в отладке посмотрел даже...
у меня например 2 элемента в векторе, он 2 и обработает. А по вашей теории 3 должен. Чего не происходит. Сначала происходит видимо p++, а потом уже сравнение
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
шарпопочитатель
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 956
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
1929 / 1195 / 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
шарпопочитатель
58 / 25 / 1
Регистрация: 31.01.2010
Сообщений: 956
24.10.2011, 16:10  [ТС] #14
diagon,
в данном случае , я как понимаю,
C++
1
2
++it
it++
можно писать хоть как.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
24.10.2011, 16:12 #15
ht1515, Зачем копию создавать лишнюю?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2011, 16:12
Привет! Вот еще темы с ответами:

Вывод вектора - C++
Почему я не могу вывести вектор на печать? #include&lt;std_lib_facilities.h&gt; class Token { public: char ch; double var; ...

Вывод вектора ax+b - C++
Программа решает систему методом зейделя, помогите пожалуйста в завершающей точке вывести вектор ах-б :) //#include &quot;stdafx.h&quot; ...

Вывод вектора - C++
#include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; int i = 0; class Book { protected:

Вывод вектора - C++
#include &lt;iostream&gt; #include &quot;conio.h&quot; #include &lt;vector&gt; struct train { int in, out; }tr;


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

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

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