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

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

Восстановить пароль Регистрация
 
MalinChyn
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 7
25.02.2013, 20:20     Почему не запоминается правильно итератор вектора? #1
Почему, если сделать что-то такое:

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) случае? Там какой-то мусор.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
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
636 / 557 / 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++

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

Или воспользуйтесь поиском по форуму:
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     Почему не запоминается правильно итератор вектора?
Ответ Создать тему
Опции темы

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