шарпопочитатель
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
1

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

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

Author24 — интернет-сервис помощи студентам
почему когда выводим данные вектора пишем так:
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--)
?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2011, 09:22
Ответы с готовыми решениями:

Вывод элементов вектора
решение задачи храню в таком виде result.emplace_back(t, x, psi, u); как вывести все...

Вывод элементов вектора
cout &lt;&lt; &quot;\nвведите слово которое удалить&quot;; cin &gt;&gt; del; system(&quot;cls&quot;); for (fr =...

Размер вектора и вывод элементов
Объясните почему в функции print размер передаваемого вектора v.size()=0? Соответсвенно не работает...

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

17
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
24.10.2011, 09:28 2
Цитата Сообщение от ht1515 Посмотреть сообщение
а если надо вывести список наоборот то
то используй reverse_iterator
1
Заблокирован
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++)
0
4 / 4 / 1
Регистрация: 19.10.2011
Сообщений: 20
24.10.2011, 09:47 4
насколько я знаю, begin() указывает на первый элемент в векторе, в то время как end() указывает на то что находится после последнего элемента.

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

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

p в этот момент будит указывать на элемент за пределами диапазона вектора. попытка получить доступ к объекту через такой итератор - "неизвестное поведение" (udefined behavior)
0
шарпопочитатель
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
24.10.2011, 10:37  [ТС] 8
Bers, брр, вообще-то нет. Ну я в отладке посмотрел даже...
у меня например 2 элемента в векторе, он 2 и обработает. А по вашей теории 3 должен. Чего не происходит. Сначала происходит видимо p++, а потом уже сравнение
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.10.2011, 10:47 9
Bers, Гон.
0
Заблокирован
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 будит указывать на последний элемент
0
шарпопочитатель
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
24.10.2011, 10:59  [ТС] 11
C++
1
for (vector<RecVecR>::iterator p =vecR.end()-1 ; p != vecR.begin();p--)
в этом случае vecR.begin() не выведется
reverse_iterator я начал юзать уже. Так по ГОСТУ просто и ладно. Сразу лучше делать буду по правилам.
0
Заблокирован
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 я начал юзать уже. Так по ГОСТУ просто и ладно. Сразу лучше делать буду по правилам.
Работает и ладно. А понимать принцип работы совсем не обязательно.
0
Higher
1953 / 1219 / 120
Регистрация: 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, " ") );
0
шарпопочитатель
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
24.10.2011, 16:10  [ТС] 14
diagon,
в данном случае , я как понимаю,
C++
1
2
++it
it++
можно писать хоть как.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.10.2011, 16:12 15
ht1515, Зачем копию создавать лишнюю?
0
шарпопочитатель
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
24.10.2011, 18:05  [ТС] 16
ht1515, Зачем копию создавать лишнюю?
копию чего?
про пересобирание вектора через копирование не я говорил
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
24.10.2011, 18:12 17
Цитата Сообщение от ht1515 Посмотреть сообщение
в данном случае , я как понимаю,
++it
it++
можно писать хоть как.
писать-то можно, но нежелательно
it++ постикремент работает так - копируется текущее значение, текущее значение увеличивается на еденицу, возвращается сделаная копия
++it работает так - увеличивается текущее значение и возвращается ссылка на него
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.10.2011, 18:39 18
Цитата Сообщение от ht1515 Посмотреть сообщение
про пересобирание вектора через копирование не я говорил
При чем здесь пересобирание?
Просто все элементы из диапазона [vec.rbegin(); vec.rend() ) копируются в ostream_iterator, который выводит их на экран.
При постфиксном инкременте должна создаваться дополнительная сущность, что замедляет время работы. По хорошему компилятор это дело должен соптимизировать, но надежнее писать префиксный.
1
24.10.2011, 18:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2011, 18:39
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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