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

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

Войти
Регистрация
Восстановить пароль
 
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
#1

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

09.05.2011, 12:36. Просмотров 613. Ответов 2
Метки нет (Все метки)

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     Пара вопросов по итераторам
Посмотрите здесь:

Пара вопросов по С++ - C++
возникло несколько вопросов, с которыми что то не могу никак разобраться 1. Как происходит выравнивание при создании структуры? ...

Пара вопросов по C++ 11 - C++
1. чем отличаются std::forward_list и std::initializer_list? 2. не получается применять constexpr в msvs 2013 pro constexpr auto n = 0;...

пара вопросов по GUI - C++
1) итак, посмотрел Inter PRO одного банка. При наборе в IE адреса он каким-то образом переадресует запущенному Inter PRO, он в свою очередь...

Пара глупых вопросов - C++
Помогите please,please,please. Не могу понять в чем туплю, надо всего-то записать двумерный массив в файл ну и я пишу (Уже есть массив...

Пара вопросов по функторам stl - C++
Доброго времени суток! У меня возникло пара вопросов по функторам. Может кто чего подскажет? Вопрос 1. В нижеследующем коде в...

вставление строк и пара вопросов - C++
вычислить и вывести на экран в виде таблицы значение функции F на интервале от Xнач до Xконч с шагом Dx задана система: ...

Пара вопросов о рандомайзере и RadioButton - C++
1) srand((unsigned)time(NULL)); int rand_ = rand()%10; rand_ будет равен от 0 до 9 включительно или от 0 до 10 включительно? ...

Пара вопросов про массивы - C++
у меня есть пара вопросов,хотя один можно сказать относится к функциям..но тема у нас в курсе-массивы. Так вот: 1.void main() { const...

Конструкторы и деструкторы при наследовании. Пара вопросов - C++
1. Можно ли создавать виртуальный конструктор/деструктор и переопределять его без создания нового конструктора в производном классе? 2....

пара точек - C++
В множестве А1 в трехмерном пространстве найти пару точек с максимальным расстоянием между ними(использовать структуру) В множестве точек...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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++
616 / 460 / 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 оставить)?
Пробовал по разному, последний вариант:
не работает код потому что у вас в условии дизъюнкция стоит,когда должна стоять конъюнкция условий. В вашем варианте он будет молотить цикл во-первых, до конца, пока не удалит все элементы( если массив полностью из нулей состоит ), потому что первая часть условия будет оставаться истинной, а потом и вовсе будет исключение о выходе за границы массива.
Ответ Создать тему
Опции темы

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