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

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

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

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

25.02.2013, 20:20. Просмотров 495. Ответов 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++
Привет, столкнулся с тем что при использовании stl вектора понадобился итератор перехода на элемент через индекс. не могли бы вы привести...

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

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

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

Изменить значение элемента вектора, на который указывает итератор - C++
Собственно вопрос, возможно ли изменить значение элемента вектора, на который указывает итератор, на значение последнего элемента вектора,...

Как правильно вернуть итератор из метода - C++
Всем привет. Есть класс обертка над контейнером, который рулит некоторыми сущностями И понадобилось получать итераторы на эти сущности -...

Итератор. Не понятно почему не компилируется - C++
Задача на суммирование двух соседних элементов при помощи итератора. vector &lt;int&gt; n; int x; while (cin &gt;&gt; x) ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Модератор
Эксперт CЭксперт С++
6995 / 4166 / 594
Регистрация: 29.11.2010
Сообщений: 11,047
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Эксперт С++
6995 / 4166 / 594
Регистрация: 29.11.2010
Сообщений: 11,047
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
641 / 562 / 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     Почему не запоминается правильно итератор вектора?
Еще ссылки по теме:

Как более менее правильно написать итератор(не STL). - C++
Вот, например, пишу класс и всегда помню советы типа &quot;скрывайте реализацию класса&quot; или &quot;если функция по идее не должна изменять данные...

Как правильно копировать и добавлять вектора? - C++
Есть вектора vect1 и vect2, содержащие, допустим, значения double: using namespace std; vector&lt;double&gt; vect1, vect2;Как...

Как правильно ввести два вектора ? - C++
надо чтобы элементы векторов вводились с клавиатуры, а у меня что-то не получается. и еще надо будет найти сумму векторов, но это я...

Почему не сортирует вектора структур? - C++
Почему не сортирует вектора структур по фамилии? #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;vector&gt; #include...

Как правильно вызвать конструктор вектора в данном случае? - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;map&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; typedef...


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

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

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