Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288

Работа с итератором

24.05.2016, 11:38. Показов 1682. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Есть задание: 
Описать функцию с двумя параметрами: контейнер-список целых элементов и
контейнер-вектор указателей на целые. Функция должна, последовательно проходя по
элементам контейнеров от начала к концу вектора и от конца к началу списка, менять
местами элементы (целые значения) контейнеров, после чего распечатать в прямом
порядке целые значения сначала для списка, затем для вектора. Функция возвращает
количество переставленных элементов контейнеров.
Я сделал это, но не очень понимаю как переставлять элементы, если с помощью итератора можно обращаться либо в начало, либо в коне. Нужно заводить какой-то буферный итератор?
#include <iostream>
#include <list>
#include <vector>
#include <iterator>
 
using namespace std;
 
int main()
{
    list<int> int_list;
    for(int i = 0; i < 10; i++)
        int_list.push_back(i);
    list<int>::iterator p = int_list.begin();
    while(p != int_list.end())
    {
        cout << *p << " ";
        p++;
    }
    vector<int*> vect_int;
    for(int i = 9; i >= 0; i--)
    {
        vect_int.push_back(new int(i));
    }
 
    cout << endl;
    vector<int*>::iterator p_1 = vect_int.begin();
    while(p_1 != vect_int.end())
    {
        cout << **p_1 << " ";
        ++p_1;
    }
 
    cout << endl;
    p_1 = vect_int.begin();
    p = int_list.end();
    while(p_1 != vect_int.end() && p != int_list.begin())
    {      
        // что тут нужно мне не понятно
        p_1++;
        p--;
 
    }
 
    return 0;
}
Добавлено через 1 час 25 минут
Вычитал про функцию iter_swap, попытался применить, но почему-то не работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
p_1 = vect_int.begin();
    p = int_list.end();
    while(p_1 != vect_int.end() && p != int_list.begin())
    {
        iter_swap(*p_1, p);
        p_1++;
        p--;
    }
 
    cout << endl;
    p = int_list.begin();
    while(p != int_list.end())
    {
        cout << *p << " ";
        p++;
    }
    cout << endl;
    p_1 = vect_int.begin();
    while(p_1 != vect_int.end())
    {
        cout << **p_1 << " ";
        ++p_1;
    }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.05.2016, 11:38
Ответы с готовыми решениями:

ошибка с итератором
Помогите, пожалуйста, не могу понять зачем вычитать нужно еденицу из deq1.begin() #include &lt;iostream&gt; #include &lt;string&gt; ...

Проблема с итератором в <vector>
Всем привет. Помогите пожалуйста решить проблему: У меня существует класс class Book { string author,title,publishing; int...

Сравнение указателя с итератором
Здравствуйте, уважаемые знатоки! Продолжая изучать STL и итераторы наткнулся на такую вот аналогию: #include &lt;iostream&gt; ...

5
27 / 27 / 16
Регистрация: 18.05.2016
Сообщений: 128
24.05.2016, 11:46
Дык у тебя твой итератор p и будет, как ты говоришь, "буферным".
C++
1
list<int>::iterator p = int_list.begin();
Это создание итератора, который указывает на начало списка.
После
C++
1
p++
этот самый p уже указывает на второй элемент.
А
C++
1
*p
- это обращение к значению того, на что указывает итератор.
Если я, конечно, всё правильно помню.

Добавлено через 4 минуты
А в этой функции попробуй вместо *p_1 написать просто p_1.
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
24.05.2016, 14:14  [ТС]
no_attention, не получится, у меня же итератор контейнера-вектора указателей на целые

Добавлено через 1 минуту
no_attention, и стандартные действия(инкремент, получение значения) я знаю. Вот почему у меня iter_swap не работает, вот в чем вопрос

Добавлено через 1 час 57 минут
Никто не подскажет в чем моя ошибка?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
24.05.2016, 14:29
Цитата Сообщение от Nike1995 Посмотреть сообщение
Никто не подскажет в чем моя ошибка?
Для прохода в обратном направлении пользуйся reverse_iterator (rbegin, rend).
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
24.05.2016, 14:53  [ТС]
Не помогло
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <list>
#include <vector>
#include <iterator>
 
using namespace std;
 
int main()
{
    list<int> int_list;
    for(int i = 0; i < 10; i++)
        int_list.push_back(i);
    list<int>::reverse_iterator p = int_list.rbegin();
    while(p != int_list.rend())
    {
        cout << *p << " ";
        p++;
    }
    vector<int*> vect_int;
    for(int i = 9; i >= 0; i--)
    {
        vect_int.push_back(new int(i));
    }
 
    cout << endl;
    vector<int*>::iterator p_1 = vect_int.begin();
    while(p_1 != vect_int.end())
    {
        cout << **p_1 << " ";
        ++p_1;
    }
 
    cout << endl;
    p_1 = vect_int.begin();
    p = int_list.rend();
    while(p_1 != vect_int.end() && p != int_list.rbegin())
    {
        iter_swap(*p_1, p);
        ++p_1;
        p++;
    }
 
    cout << endl;
    p = int_list.rbegin();
    while(p != int_list.rend())
    {
        cout << *p << " ";
        p++;
    }
    cout << endl;
    p_1 = vect_int.begin();
    while(p_1 != vect_int.end())
    {
        cout << **p_1 << " ";
        ++p_1;
    }
 
    return 0;
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
24.05.2016, 15:43
Лучший ответ Сообщение было отмечено Nike1995 как решение

Решение

Цитата Сообщение от Nike1995 Посмотреть сообщение
Не помогло
Естественно.
Делаешь-то неправильно.
Зачем переставляешь начало и конец местами, если они и так уже переставлены?

Добавлено через 3 минуты
Nike1995,
C++
1
2
3
4
5
6
7
8
9
    p_1 = vect_int.begin();
    p = int_list.rbegin();
    while(p_1 != vect_int.end() && p != int_list.rend())
    {
        iter_swap(*p_1, p);
 
        ++p_1;
        ++p;
    }
Ну и разницы ты на своих исходных данных не увидишь. Заполни какой-нибудь контейнер разными числами, чтобы было наглядно. Например:
C++
1
2
3
4
5
    vector<int*> vect_int;
    for(int i = 19; i >= 10; i--)
    {
        vect_int.push_back(new int(i));
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2016, 15:43
Помогаю со студенческими работами здесь

Класс-контейнер стек с итератором
У меня есть задание - калькулятор комплексных чисел. Нужна помощь в написании класса-контейнера(стека), который должен хранить комплексные...

Как поймать исключение связанное с неправильным итератором?
Доброго времени суток. Не могу поймать исключение, при запуск программы выдает ошибку vector iterator not incrementable. Можно ли поймать...

Цикл с конца до начала для map с итератором
Всем доброго времени суток. Возможно ли использовать цикл for (auto it = mp.begin(); it != mp.end(); ++it) в обратном порядке? ...

Шаблонная функция принимающая вектор - что-то не так с итератором
Задачка такая: Написать шаблонную функцию принимающую вектор и суммирующую все его значения вне зависимости от типа данных. В 10...

Как обозначить значения внутри вектора для другого вектора итератором?
Например, в одном векторе есть числа 1, 3, 4. В другом векторе их 5: 25 95 45 65 75. Как сделать так, чтобы во втором векторе удалились...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru