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

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

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

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

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

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

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

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

Работа с итераторами - C++
Добрый вечер. Есть класс для работы с документами. Итераторы для него описаны не совсем верно и при использовании функции print()...

Работа с итераторами - C++
QVector &lt;CDevice*&gt; *arrayDevice; Как сделать итератор на такой объект и потом обращаться к функциям CDevice ?

Действие с итераторами - C++
Добрый вечер, потихоньку разбираюсь в книге Липпмана &quot;С++ Вводный курс&quot;, и тут вот какая штука. Там приведён следующий пример...

Запутался с итераторами - C++
Привет. Никак не могу понять почему ошибка? std::string s = &quot;sEReGA&quot;; for (std::string::iterator i = s.begin(); i != s.end();...

Ошибка с итераторами - C++
Как пройтись по контейнеру и вызвать функции из класса? main.cpp|15|error: request for member 'Area' in '*...

Непонятки с итераторами - C++
Здравствуйте, господа программисты. Пытался написать вот эту задачку, но получается что-то нехорошее. Помогите, пожалуйста! #include...

Перемещение элементов итераторами - C++
всем привет, можно ли как-то идя по коллекции итератором, переместить определенный(ые) эллементы в конец коллекции ? int main() { ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 20:34     Работа с Итераторами #2
Цитата Сообщение от NanoBreaker Посмотреть сообщение
чтобы следующий элемент списка принимал значение нынешнего
Цитата Сообщение от NanoBreaker Посмотреть сообщение
Получается что, значение первого элемента списка не изменяется, а все последующие элементы принимают значения элементов перед ними
Что значит "нынешний" ?
NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 89
21.07.2013, 20:37  [ТС]     Работа с Итераторами #3
Это элемент на который в данный момент указывает итератор.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 20:39     Работа с Итераторами #4
Итератор - не указатель.
Покажи что пробовал и где возникли проблемы.
gray_fox
What a waste!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 3
21.07.2013, 20:49     Работа с Итераторами #5
Не прочитал про "нынешний"
NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 89
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!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 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
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 89
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!
1446 / 1175 / 61
Регистрация: 21.04.2012
Сообщений: 2,463
Завершенные тесты: 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
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 89
21.07.2013, 21:21  [ТС]     Работа с Итераторами #10
Большое спасибо, теперь работает.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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++
У меня есть шаблон класса контейнер. Я использую vector из stl. Так вот мне нужен итератор для поиска find ( first, last, value ) но...

Инициализировать вектор итераторами множества - C++
Возможна ли инициализация вектора итераторами? set&lt;int&gt; s={1,2,3,4,5}; set&lt;int&gt;::iterator it=s.begin(),it2=s.end(); ...

Не до конца понимаю работу с итераторами - C++
Реализовать вспомогательный класс, который мог бы работать как заместитель контейнера, обеспечивая для пользователей полный интерфейс...

итераторами для std::set - C++
Здравствуйте! Разбирая std::set и его итераторы столкнунлась с ужасающей проблемой: когда передаю итератор в качестве параметра...

Считать посимвольно файл стандартными средствами и итераторами - C++
Необходимо прочитать файл в котором находится мусор, из файла требуются только определенные символы (сам сделаю) и поместить это в...


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

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

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