Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 7
1

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

25.02.2013, 20:20. Показов 959. Ответов 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) случае? Там какой-то мусор.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2013, 20:20
Ответы с готовыми решениями:

Почему запоминается сессия?
Почему, когда я запоминаю переменную в $_SESSION и закрываю браузер она сохраняется? Куки я не...

Почему не запоминается переменная после первого вызова функции ?
В общем есть кнопки и одна последняя кнопка . На них поставил функции по клику менять значение...

Итератор вектора
Только начал изучать STL. Проблема с итератором. conversion from 'std::vector&lt;Alfa&gt;::iterator...

Итератор для вектора
Привет, столкнулся с тем что при использовании stl вектора понадобился итератор перехода на элемент...

6
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
25.02.2013, 20:31 2
Вы не понимаете сути метода end(). Он возвращает итератор, который идет за последним элементом контейнера.
1
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;
0
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
25.02.2013, 21:08 4
Можно использовать rbegin() , только это уже reverse_iterator
0
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 (...) лишняя и осталась от предыдущей попытки понять, в чём дело
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
27.02.2013, 12:43 6
Храни не итераторы, а индексы (int значение) итераторы при добавлении элементов могут стать не действительными, потому что так работает вектор, советую получше изучить его работу, есть неплохая книга по ним С.Майерс Эффективное использование STL(как то так называется)
1
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 7
27.02.2013, 20:36  [ТС] 7
Задача этого блока: удвоить пробел в уже заполненном векторе. Для этого подходит из стандартных, возможно, только метод vector.insert (). Методу должен передаваться первым аргументом итератор вектора, на позицию которого нужно вставить новый элемент.
А посему, не выйдет запоминать индекс (i).
Даже если я воспользуюсь фишкой в цикле: vector.insert (vector.begin () + [i], ' '), то после добавления пробела индекс сместится, и будет сохранён уже неправильно.

Добавлено через 5 минут
Однако, верно, ничто не мешает мне всего лишь увеличить индекс на единицу.
Спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2013, 20:36

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Можно ли итератор вектора декрементировать?
Добрый день ! Можно ли итератор вектора декрементировать ?

Удаление элементов вектора через итератор
почему так: //работает vector&lt;int&gt;::iterator it=garage.begin(); while(it!=garage.end()) {...

Можно ли при использовании вектора не использовать итератор?
можно ли при использование вектора не использовать итератор?

Как вывести элементы двумерного вектора через итератор?
int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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