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

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

Восстановить пароль Регистрация
 
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 82
21.07.2013, 20:30     Работа с Итераторами #1
Здравствуйте, у меня возникла следующая проблема.

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

Мне надо, чтобы следующий элемент списка принимал значение нынешнего. Может кто-то пожалуйста написать цикл с использованием итераторов. ( Получается что, значение первого элемента списка не изменяется, а все последующие элементы принимают значения элементов перед ними. )
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2013, 20:30     Работа с Итераторами
Посмотрите здесь:

итераторами для std::set C++
C++ Помогите разобраться с итераторами
Действие с итераторами C++
C++ Работа с итераторами
C++ Запутался с итераторами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 20:34     Работа с Итераторами #2
Цитата Сообщение от NanoBreaker Посмотреть сообщение
чтобы следующий элемент списка принимал значение нынешнего
Цитата Сообщение от NanoBreaker Посмотреть сообщение
Получается что, значение первого элемента списка не изменяется, а все последующие элементы принимают значения элементов перед ними
Что значит "нынешний" ?
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 82
21.07.2013, 20:37  [ТС]     Работа с Итераторами #3
Это элемент на который в данный момент указывает итератор.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 20:39     Работа с Итераторами #4
Итератор - не указатель.
Покажи что пробовал и где возникли проблемы.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
21.07.2013, 20:49     Работа с Итераторами #5
Не прочитал про "нынешний"
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 82
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
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
Сообщений: 82
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
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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
Сообщений: 82
21.07.2013, 21:21  [ТС]     Работа с Итераторами #10
Большое спасибо, теперь работает.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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++ Инициализировать вектор итераторами множества

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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     Работа с Итераторами
Ответ Создать тему
Опции темы

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