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

Пара вопросов по итераторам - C++

Восстановить пароль Регистрация
 
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.05.2011, 12:36     Пара вопросов по итераторам #1
1. Почему в этом коде элементы удаляются через одного?
C++
1
2
for (std::vector <int>::iterator j = vector.begin(); j < vector.end(); j++)
                vector.erase(j)
2.Как с помощью итераторов удалить нули с конца(но если весь массив состоит из нулей, то 1 оставить)?
Пробовал по разному, последний вариант:
C++
1
2
while (*(c.end()-1)==0||(c.end()-1)!=c.begin())
        c.pop_back();
Где-то зацикливается.
UPD:
2й вопрос решил так
C++
1
2
while (vector.size() > 1 && vector.back() == 0)
    vector.pop_back();
Но почему не работает предыдущий код все еще загадка
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2011, 12:36     Пара вопросов по итераторам
Посмотрите здесь:

пара вопросов по GUI C++
C++ вставление строк и пара вопросов
C++ Пара вопросов по С++
Пара вопросов про массивы C++
C++ Пара вопросов по функторам stl
C++ Пара вопросов о рандомайзере и RadioButton
Пара глупых вопросов C++
C++ Пара вопросов по C++ 11

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mansp
18 / 18 / 0
Регистрация: 07.11.2010
Сообщений: 136
09.05.2011, 12:58     Пара вопросов по итераторам #2
Цитата Сообщение от diagon Посмотреть сообщение
Почему в этом коде элементы удаляются через одного?
Код C++1
2 for (std::vector <int>::iterator j = vector.begin(); j < vector.end(); j++)
vector.erase(j)
вот так можно
C++
1
 vector.erase (vector.begin(),vector.end())
erase ведь удаляет елемент вектора и сдвигает его грубо говоря ,циклом ты просто удаляеш елемент, затем вектор сдвигаетса, тот элемент корой должен быть после удалённого стает на его место ,дальше выходит ты просто перескакиваеш
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
09.05.2011, 13:23     Пара вопросов по итераторам #3
Цитата Сообщение от diagon Посмотреть сообщение
1. Почему в этом коде элементы удаляются через одного?
потому что при каждом erase все итераторы вектора, находящиеся дальше удаленного элемента сдвигаются, а сам erase возвращает правильный итератор на следующий элемент, которой стоит после удаленного. Вы этих сдвигов не учитываете, следовательно, при каждом удалении у вас итератор сдвигается на одну позицию дальше.
Будет правильнее сделать так :
C++
1
2
for (std::vector <int>::iterator j = vector.begin(); j < vector.end(); )
     j = vector.erase(j);
А вообще всегда думайте над тем, чтобы заменять поэлементные операции их интервальными аналогами. Да и, в конце концов, если требуется очистить вектор полностью, то почему бы не сделать вызов vector.clear() ?
Цитата Сообщение от diagon Посмотреть сообщение
2.Как с помощью итераторов удалить нули с конца(но если весь массив состоит из нулей, то 1 оставить)?
Пробовал по разному, последний вариант:
не работает код потому что у вас в условии дизъюнкция стоит,когда должна стоять конъюнкция условий. В вашем варианте он будет молотить цикл во-первых, до конца, пока не удалит все элементы( если массив полностью из нулей состоит ), потому что первая часть условия будет оставаться истинной, а потом и вовсе будет исключение о выходе за границы массива.
Yandex
Объявления
09.05.2011, 13:23     Пара вопросов по итераторам
Ответ Создать тему
Опции темы

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