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

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

Войти
Регистрация
Восстановить пароль
 
MalinChyn
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 7
#1

Почему не запоминается правильно итератор вектора? - C++

25.02.2013, 20:20. Просмотров 472. Ответов 6
Метки нет (Все метки)

Почему, если сделать что-то такое:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
using namespace std;
 
int main ()
{
vector <char> vector_of_char;
vector <vector <char>::iterator> IndexOfSpaces;
vector <char>::iterator it;
char some_char;
 
cin » some_char;
vector_of_char.push_back (some_char);
IndexOfSpaces.push_back (vector_of_char.end ());
it = vector_of_char.end ();
 
return 0;
}
то под отладчиком видно, что правильный итератор, вектора vector_of_char не запоминается ни в первом (в векторе IndexOfSpaces), ни во втором (it) случае? Там какой-то мусор.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 20:20     Почему не запоминается правильно итератор вектора?
Посмотрите здесь:

Изменить значение элемента вектора, на который указывает итератор C++
C++ Как более менее правильно написать итератор(не STL).
C++ Как правильно ввести два вектора ?
Можно ли при использовании вектора не использовать итератор? C++
C++ удаление элументов вектора через итератор
C++ Итератор для вектора
C++ Итератор. Не понятно почему не компилируется
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6228 / 3473 / 425
Регистрация: 29.11.2010
Сообщений: 9,178
25.02.2013, 20:31     Почему не запоминается правильно итератор вектора? #2
Вы не понимаете сути метода end(). Он возвращает итератор, который идет за последним элементом контейнера.
MalinChyn
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 7
25.02.2013, 21:06  [ТС]     Почему не запоминается правильно итератор вектора? #3
Да, сглупил. Спасибо.
И значит, чтобы всё-таки получить итератор на последний элемент в векторе, достаточно:
C++
1
2
IndexOfSpaces.push_back (vector_of_char.end () - 1);
it = vector_of_char.end () - 1;
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6228 / 3473 / 425
Регистрация: 29.11.2010
Сообщений: 9,178
25.02.2013, 21:08     Почему не запоминается правильно итератор вектора? #4
Можно использовать rbegin() , только это уже reverse_iterator
MalinChyn
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 7
27.02.2013, 08:52  [ТС]     Почему не запоминается правильно итератор вектора? #5
Возник ещё один вопрос. Когда я попробовал запомнить в другом векторе (IndexOfSpaces) итераторы, то у меня не получилось, потому что, кажется, каждый раз выделялись адреса памяти, которые затирали предыдущие адреса-итераторы (закомментировано в коде).
В цикле for мне нужно было удвоить исходный пробел, хранящийся уже в векторе (vector_of_char). По причине затирания адресов-итератов, я вставлял пробел методом .insert () не на адрес итератора пробела, а на позицию следующего за пробелом итератора (it + 1). Но почему-то адрес всё равно затирается на третьем прохождении тела условия в цикле. И вопрос: почему, как этого избежать и всё-таки вставить пробелы в вектор?
(На сколько я понимаю, ссылки на адреса памяти, где в заданном векторе хранится какой-то конкретный элемент) пробела во время добавления в новых элементов в вектор.)
Пример входных данных:
0 1 2 3 4 5 6 7 8S

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
#include <iostream>
#include <vector>
using namespace std;
 
int main ()
{
vector <char> vector_of_char;
vector <vector <char>::iterator> IndexOfSpaces;
vector <char>::iterator it;
char some_char;
 
while (cin.get (some_char) && some_char != 'S') {
vector_of_char.push_back (some_char);
//if (some_char == ' ') {
    //IndexOfSpaces.push_back (vector_of_char.end () - 1);
    //it = vector_of_char.end () - 1;
//}
}
 
 
for (it = vector_of_char.begin (); it != vector_of_char.end (); it++)
    if (*it == ' ') {
        vector_of_char.insert (it + 1, ' ');
        vector_of_char.resize(vector_of_char.size());
        it +=2;         // перепрыгнуть через только что созданный пробел
    }
 
 
 
return 0;
}
Добавлено через 11 часов 25 минут
Простите, строчка vector_of_char.resize (...) лишняя и осталась от предыдущей попытки понять, в чём дело
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.02.2013, 12:43     Почему не запоминается правильно итератор вектора? #6
Храни не итераторы, а индексы (int значение) итераторы при добавлении элементов могут стать не действительными, потому что так работает вектор, советую получше изучить его работу, есть неплохая книга по ним С.Майерс Эффективное использование STL(как то так называется)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2013, 20:36     Почему не запоминается правильно итератор вектора?
Еще ссылки по теме:

Как правильно вызвать конструктор вектора в данном случае? C++
C++ Можно ли итератор вектора декрементировать?
Объяснить, почему размер вектора остаётся нулевым C++
Почему не происходит рекурсивный реверс всего вектора? C++
C++ Как правильно копировать и добавлять вектора?

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

Или воспользуйтесь поиском по форуму:
MalinChyn
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 7
27.02.2013, 20:36  [ТС]     Почему не запоминается правильно итератор вектора? #7
Задача этого блока: удвоить пробел в уже заполненном векторе. Для этого подходит из стандартных, возможно, только метод vector.insert (). Методу должен передаваться первым аргументом итератор вектора, на позицию которого нужно вставить новый элемент.
А посему, не выйдет запоминать индекс (i).
Даже если я воспользуюсь фишкой в цикле: vector.insert (vector.begin () + [i], ' '), то после добавления пробела индекс сместится, и будет сохранён уже неправильно.

Добавлено через 5 минут
Однако, верно, ничто не мешает мне всего лишь увеличить индекс на единицу.
Спасибо.
Yandex
Объявления
27.02.2013, 20:36     Почему не запоминается правильно итератор вектора?
Ответ Создать тему
Опции темы

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