Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
ht1515
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,003
1

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

24.10.2011, 09:22. Просмотров 1142. Ответов 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--)
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2011, 09:22
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Цитата Сообщение от gogajeti Посмотреть сообщение
begin() указывает на первый элемент в векторе, в то время как end() указывает на то что находится после последнего элемента.
0
ht1515
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,003
24.10.2011, 10:19  [ТС] 6
Bers, всмысле так что ли
C++
1
for (vector<RecVecR>::iterator p =vecR.begin() ; p < vecR.end();p++)
не совсем понял
Теперь гляньте внимательно на строчку кода, и найдите в ней ошибку
0
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)
0
ht1515
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,003
24.10.2011, 10:37  [ТС] 8
Bers, брр, вообще-то нет. Ну я в отладке посмотрел даже...
у меня например 2 элемента в векторе, он 2 и обработает. А по вашей теории 3 должен. Чего не происходит. Сначала происходит видимо p++, а потом уже сравнение
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.10.2011, 10:47 9
Bers, Гон.
0
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 будит указывать на последний элемент
0
ht1515
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,003
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
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 я начал юзать уже. Так по ГОСТУ просто и ладно. Сразу лучше делать буду по правилам.
Работает и ладно. А понимать принцип работы совсем не обязательно.
0
diagon
Higher
1937 / 1203 / 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
ht1515
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,003
24.10.2011, 16:10  [ТС] 14
diagon,
в данном случае , я как понимаю,
C++
1
2
++it
it++
можно писать хоть как.
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.10.2011, 16:12 15
ht1515, Зачем копию создавать лишнюю?
0
ht1515
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,003
24.10.2011, 18:05  [ТС] 16
ht1515, Зачем копию создавать лишнюю?
копию чего?
про пересобирание вектора через копирование не я говорил
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.10.2011, 18:12 17
Цитата Сообщение от ht1515 Посмотреть сообщение
в данном случае , я как понимаю,
++it
it++
можно писать хоть как.
писать-то можно, но нежелательно
it++ постикремент работает так - копируется текущее значение, текущее значение увеличивается на еденицу, возвращается сделаная копия
++it работает так - увеличивается текущее значение и возвращается ссылка на него
0
diagon
Higher
1937 / 1203 / 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2011, 18:39

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

Вывод вектора
#include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; int i = 0; ...

Вывод вектора ax+b
Программа решает систему методом зейделя, помогите пожалуйста в завершающей...


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

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

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