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

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

Войти
Регистрация
Восстановить пароль
 
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 88
#1

Работа с Итераторами - C++

21.07.2013, 20:30. Просмотров 725. Ответов 11
Метки нет (Все метки)

Здравствуйте, у меня возникла следующая проблема.

У меня есть list<pair<int, int> > snake;

Мне надо, чтобы следующий элемент списка принимал значение нынешнего. Может кто-то пожалуйста написать цикл с использованием итераторов. ( Получается что, значение первого элемента списка не изменяется, а все последующие элементы принимают значения элементов перед ними. )
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 20:34     Работа с Итераторами #2
Цитата Сообщение от NanoBreaker Посмотреть сообщение
чтобы следующий элемент списка принимал значение нынешнего
Цитата Сообщение от NanoBreaker Посмотреть сообщение
Получается что, значение первого элемента списка не изменяется, а все последующие элементы принимают значения элементов перед ними
Что значит "нынешний" ?
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 88
21.07.2013, 20:37  [ТС]     Работа с Итераторами #3
Это элемент на который в данный момент указывает итератор.
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 20:39     Работа с Итераторами #4
Итератор - не указатель.
Покажи что пробовал и где возникли проблемы.
gray_fox
What a waste!
 Аватар для gray_fox
1249 / 1132 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
21.07.2013, 20:49     Работа с Итераторами #5
Не прочитал про "нынешний"
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 88
21.07.2013, 20:54  [ТС]     Работа с Итераторами #6
C++
1
2
3
4
5
for(auto iter = snake_blocks.end(); iter != snake_blocks.begin(); --iter)
{
    iter -> first = --iter -> first;
    iter -> second = --iter -> second;
}
Для примера с массивом цикл выглядел бы так (массив из 5 элементов):
C++
1
2
3
4
5
for(int i = 4; i != 0; i--)
{
    array[i].first = array[i - 1].first;
    array[i].second = array[i - 1].second;
}
Более чем уверен что с итераторами полную фигню написал )
gray_fox
What a waste!
 Аватар для gray_fox
1249 / 1132 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
21.07.2013, 20:58     Работа с Итераторами #7
NanoBreaker, может так, я не уверен, что понял тебя:
C++
1
2
3
for (auto first(snake_blocks.rbegin()), second(first); ++second != snake_blocks.rend(); ++first) {
   *first = *second;
}
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 88
21.07.2013, 21:07  [ТС]     Работа с Итераторами #8
Ммм, нет
First и Second, это координаты x и y соответственно.
Я использовал pair<int, int>, чтобы лишний раз не составлять структуру.

Просмотри вариант с одномерным массивом и тогда всё станет ясно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct P
{
    int first;
    int second;
};
. . .
P array[5] = { 0,1,2,3,4,5,6,7,8,9 };
. . .
for(int i = 4; i != 0; i--)
{
    array[i].first = array[i - 1].first;
    array[i].second = array[i - 1].second;
}
gray_fox
What a waste!
 Аватар для gray_fox
1249 / 1132 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
21.07.2013, 21:14     Работа с Итераторами #9
NanoBreaker, ) большая разница?
C++
1
2
3
4
for (auto first(snake_blocks.rbegin()), second(first); ++second != snake_blocks.rend(); ++first) {
   first->first  = second->first;
   first->second = second->second;
}
Добавлено через 2 минуты
Цитата Сообщение от NanoBreaker Посмотреть сообщение
Я использовал pair<int, int>, чтобы лишний раз не составлять структуру.
И почему бы не использовать std::pair вместо своей структуры? Там хоть оператор присваивания есть...)
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 88
21.07.2013, 21:21  [ТС]     Работа с Итераторами #10
Большое спасибо, теперь работает.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
22.07.2013, 00:35     Работа с Итераторами #11
Цитата Сообщение от NanoBreaker Посмотреть сообщение
Мне надо, чтобы следующий элемент списка принимал значение нынешнего
Если задача заключается в движении змейки на одну клетку, перебирать весь список не требуется.

Глянь сюда. Змейка
всё движение заключается в
C++
1
2
3
4
5
6
7
8
9
pos=snake.back();
    snake.pop_back();//подвинуть хвост
    put_cell(pos, SPACE);//стереть хвост с экрана, если в нём одна клетка
    pos=snake.front();
    pos.X+=dir.X; 
    pos.Y+=dir.Y;//подвинуть голову
 ///////
    snake.push_front(pos);//добавить змейке двинутую бошку
    put_cell(pos, DOT);//нарисовать эту бошку
и никаких циклов!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2013, 01:12     Работа с Итераторами
Еще ссылки по теме:

C++ Инициализировать вектор итераторами множества
C++ Перемещение элементов итераторами
Ошибка с итераторами C++
Работа с итераторами C++
Не до конца понимаю работу с итераторами C++

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1249 / 1132 / 54
Регистрация: 21.04.2012
Сообщений: 2,357
Завершенные тесты: 3
22.07.2013, 01:12     Работа с Итераторами #12
NanoBreaker, вообще циклы не нужны, можно просто список "пересвязать" и обновить значение в начале:
C++
1
2
3
auto const& front = snake_blocks.front();
snake_blocks.splice(std::end(snake_blocks), snake_blocks, std::begin(snake_blocks), std::prev(std::end(snake_blocks)));
snake_blocks.front() = front;
Yandex
Объявления
22.07.2013, 01:12     Работа с Итераторами
Ответ Создать тему
Опции темы

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