Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Droom
3 / 3 / 0
Регистрация: 23.01.2011
Сообщений: 71
#1

Удаление первых n элементов из vector - C++

19.05.2013, 21:53. Просмотров 660. Ответов 14
Метки нет (Все метки)

Почему, к примеру, если k=3 а pop=2, то студия выдаст ошибку(итератор вне допустимого диапазона) при запуске функции erase. По моей логике, необходимо было удалить первый элемент.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdio>
#include <iostream>
#include <vector>
#define pb push_back
#define ull unsigned long long
using namespace std;
 
vector<int> t;
 
...
int main()
{
    ...
        t.erase(t.begin(),t.begin()+k-pop);
        ...
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2013, 21:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление первых n элементов из vector (C++):

Удаление элементов из vector<string> - C++
Здравствуйте.Решаю одну задачу, столкнулся с такой проблемой. Имеется vector&lt;string&gt;, в котором записан набор слов.Требуется удалить...

Удаление элементов из std::vector - C++
У меня есть класс Zone. Но объявлен как массив vector в другом классе. class World { public: std::vector&lt;Zone*&gt;Zones; ... ...

Vector, список. Удаление и вставка элементов - C++
Из входного потока сформировать вектор вещественных чисел. Удалить из вектора все элементы, у которых дробная часть &lt; 0.5. Перед каждым...

Удаление элементов из vector; bind или not1 - C++
Как правильно забиндить, - сделать аналог, как через лямбду. Или же тут больше подойдет использование not1 (или not2). Не могу сам...

Вычислить и напечатать произведение первых 7 элементов и сумм следующих элементов, которые находятся на первых позициях - C++
Дано одномерный массив Т, состоящий из 18 символов. Вычислить и напечатать произведение первых 7 элементов и сумм следующих элементов,...

Удаление элемента из vector - C++
Здорова! Пытаюсь удалить элемент из vector&lt;string&gt;, но чото ошибку выдает и я вообще не пойму что за ошибка. Вот код который ошибку...

14
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.05.2013, 22:05 #2
если написать
C++
1
t.erase(t.begin(),t.begin()+(k-pop));
то все будет в порядке
0
Droom
3 / 3 / 0
Регистрация: 23.01.2011
Сообщений: 71
19.05.2013, 22:22  [ТС] #3
Спасибо, совсем забыл, что для указателей отнимание не определено.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.05.2013, 22:33 #4
Цитата Сообщение от Droom Посмотреть сообщение
Спасибо, совсем забыл, что для указателей отнимание не определено.
не уверен. ведь
C++
1
t.erase(t.begin(),t.end()-1);
схавает

Добавлено через 2 минуты
даже скажу больше. вот так работает
C++
1
a.erase(a.begin(), a.begin()+2-1);
Добавлено через 1 минуту
скорее всего, оно делает каждую операцию отдельно и потому, если в векторе 2 элемента, то операция a.begin()+3 является недопустимой. а то,что ты потом вычитаешь, его не волнует
1
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.05.2013, 22:35 #5
Суть в том, что при вычислении итератора происходит выход за пределы вектора. Это и отлавливает среда. Нельзя например взять begin() - 1, а потом +1, т.к. при вычитании уже произойдет выход из диапазона.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.05.2013, 22:37 #6
Tulosba, почему сначала все вылавливается, а не считается конечный ответ? ведь вся сумма не вылазит за пределы
0
Droom
3 / 3 / 0
Регистрация: 23.01.2011
Сообщений: 71
19.05.2013, 22:47  [ТС] #7
Я пока не вижу особых проблем в том, чтобы выйти за пределы массива в ходе вычисления ответа, если конечный ответ будет в пределах массива. Другой вопрос, а если в ходе вычисления ответ будет выходить за пределы всей мыслимой памяти?
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.05.2013, 22:48 #8
Droom, "мыслимой памяти"-это за всю оперативку твоего компа?
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.05.2013, 22:52 #9
Цитата Сообщение от metaluga145 Посмотреть сообщение
почему сначала все вылавливается, а не считается конечный ответ?
Есть приоритет операций, после каждого изменения итератора среда мониторит выход за пределы диапазона. Когда указываете скобки, Вы меняете последовательность изменения значения итератора, в результате чего нарушения диапазона не происходит.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.05.2013, 22:53 #10
Цитата Сообщение от Tulosba Посмотреть сообщение
после каждого изменения итератора среда мониторит выход за пределы диапазона
да это я понял. я не понимаю в чем логика такой проверки?
0
Droom
3 / 3 / 0
Регистрация: 23.01.2011
Сообщений: 71
19.05.2013, 22:56  [ТС] #11
Цитата Сообщение от metaluga145 Посмотреть сообщение
Droom, "мыслимой памяти"-это за всю оперативку твоего компа?
Да, именно за пределы оперативной памяти.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.05.2013, 22:58 #12
Droom, то же самое, что при просто выходите за пределы массива а вот, если ты заполнишь до упора, то не ясно:или засвопит, или просто закроет
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.05.2013, 23:06 #13
Цитата Сообщение от metaluga145 Посмотреть сообщение
я не понимаю в чем логика такой проверки?
Проверять валидность итератор до его разыменования?
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
19.05.2013, 23:10 #14
Цитата Сообщение от Tulosba Посмотреть сообщение
Проверять валидность итератор до его разыменования?
почему это делать после каждого изменения итератора,а не 1 раз?
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.05.2013, 23:11 #15
все зависит от реализации итератора.
для некоторых контейнеров такие фокусы не прокатят вообще.
для вектора - в дебаге могут навтыкать всяких проверок. в релизе итератор может оказаться просто указателем
и в этом случае ничего страшного не будет, пока указатель не разыменуют.
1
19.05.2013, 23:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2013, 23:11
Привет! Вот еще темы с ответами:

Удаление объекта из <vector> - C++
Подскажите, пожалкуйста Имею следующий код: EditTest() - friend фукнция для другого класса, в нее мы входим и перемещаемся уже...

Удаление элемента из vector - C++
Подскажите как удалить 1 элемент из массива типа vector, delete не работает почему-то?

Удаление элемента из std::vector<> - C++
- Здравствуйте завсегдатаи! Подскажите пожалуйста, можно ли из STL-ского вектора std::vector&lt;int&gt; удалить не последний элемент (с...

Удаление vector, list, string - C++
Привет! Такая задача. В программе я описал класс Class1. Класс содержит поля стандартных типов, а также поле std::string и...


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

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

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