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

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

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

Двумерынй вектор, удаление через erase - C++

31.08.2012, 13:17. Просмотров 644. Ответов 9
Метки нет (Все метки)

Есть двумерный вектор Clusters:
std::vector <std::vector <int> > Clusters (ExternalSetV.size(), std::vector <int> (1));
Изначально размер строк 1, потом может увеличиваться. После определенных действий нужно удалить строку из вектора, использую: Clusters.erase(Clusters.begin() + X);
Это все происходит в цикле по размеру вектора Clusters: while (Clusters.size() > Y).
Весь процесс итерационный и выполняется 100 раз (каждый раз вектор Clusters создается заново, с новым размером). На какой-то из итераций (может вылететь на первой, может на сотой) вылетает ошибка доступа: Access violation at adress 004085C6 in module 'Project1.exe'. Read of address 438C9618. И выкидывает на строку из библиотеки вектора:
iterator begin() { return this->_M_start; }
В чем может быть дело?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2012, 13:17
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Двумерынй вектор, удаление через erase (C++):

вектор алгоритм erase - C++
Доброго всем времени суток.Пожалуйста подскажите чайнику.Пытаюсь из контейнера убрать лишние данные с помощью erase ,но ничего не...

Шаблон класса вектор с операциями индексации и функциями insert и erase - C++
У меня есть задача. функции erase и insert я реализовала. но чтобы они работали нужно написать LOL&amp; operator(int); Задача звучит...

Вектор. Удаление(сдвиг) элементов - C++
Сдвигаем все элементы, стоящие после указанной позиции на 1 ячейку влево void IntegerVectorDeleteAt(IntegerVector &amp; _vector, int...

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

Вывести вектор через messagebox - C++
как мне вывести вектор через messagebox?(( часа 3 рыл интернет, пытался понять. Или не через messagebox можно как-то.. в MFC работаю Я...

Переделать код через вектор - C++
Нужно сделать код не через строки, а через вектор #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { ...

9
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.08.2012, 13:21 #2
покажи код
0
Stille
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 5
31.08.2012, 13:25  [ТС] #3
C++
1
2
3
4
5
6
7
8
9
std::vector <std::vector <int> > Clusters (ExternalSetV.size(), std::vector <int> (1));
...
for (int i=0 ; i<ExternalSetV.size() ; i++)
                Clusters[i][0] = i;
while (Clusters.size() > ExternalSetSize)
        {
        Всякие действия по выяснению того, какую строку удалять
        Clusters.erase(Clusters.begin() + Minj);
        }
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.08.2012, 13:37 #4
откуда берется Minj?
перепиши так:
C++
1
2
3
4
5
if (Clusters.size() > Minj){
   Clusters.erase(Clusters.begin() + Minj);
} else {
   // покажи оба значения: Clusters.size() & Minj
}
0
Stille
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 5
31.08.2012, 13:41  [ТС] #5
Цитата Сообщение от novi4ok Посмотреть сообщение
откуда берется Minj?
перепиши так:
C++
1
2
3
4
5
if (Clusters.size() > Minj){
   Clusters.erase(Clusters.begin() + Minj);
} else {
   // покажи оба значения: Clusters.size() & Minj
}
Minj получается путем долгих манипуляций, но она выясняется в цикле, ограниченному по Clusters.size():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                double Min;
                int Mini, Minj;
                Min = Distances[0][1];
                for (int i=0 ; i<Clusters.size() ; i++)
                {
                        for (int j=0 ; j<Clusters.size() ; j++)
                        {
                                if (i != j)
                                {
                                        if (Min > Distances[i][j])
                                        {
                                                Min = Distances[i][j];
                                                Mini = i;
                                                Minj = j;
                                        }
                                }
                        }
                }
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.08.2012, 19:30 #6
вроде получается, что Minj не может быть меньше размера вектора, но ты попробуй написать как я предложил, и вылови эту ситуацию. или в отладчике посмотри call stack в момент, когда вылетает эта ситуация. или приведи весь код полностью, я попробую воспроизвести. можно, конечно, чисто мозговыми усилиями дойти, но это - если удовольствие доставляет. а если быстро причину нужно найти - мой путь быстрее.
0
Stille
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 5
31.08.2012, 19:58  [ТС] #7
Цитата Сообщение от novi4ok Посмотреть сообщение
вроде получается, что Minj не может быть меньше размера вектора, но ты попробуй написать как я предложил, и вылови эту ситуацию. или в отладчике посмотри call stack в момент, когда вылетает эта ситуация. или приведи весь код полностью, я попробую воспроизвести. можно, конечно, чисто мозговыми усилиями дойти, но это - если удовольствие доставляет. а если быстро причину нужно найти - мой путь быстрее.
Я пробовал так, как ты написал, ничего не изменилось, т.к. он никогда и не был меньше размера вектора. Я сделал чуть по другому:
вместо
C++
1
Clusters.erase(Clusters.begin() + Minj);
написал
C++
1
Clusters.erase(Clusters.end() - 1 - (Clusters.size() - Minj));
и, по какой-то неизвестной мне причине, ошибки стали вылетать реже. Не исчезли совсем, но реже и уже на другую строчку библиотеки вектора:
C++
1
size_type size() const        { return size_type(this->_M_finish - this->_M_start); }
Поищу еще проблему, если не найду, то перепишу всю функцию. Но, используя Clusters.end(), он хотя бы иногда (где-то в 30% случаев) проходит все 100 итераций без вылетов
0
grizlik78
Эксперт С++
1981 / 1474 / 127
Регистрация: 29.05.2011
Сообщений: 3,047
31.08.2012, 21:43 #8
Цитата Сообщение от Stille Посмотреть сообщение
Minj получается путем долгих манипуляций, но она выясняется в цикле, ограниченному по Clusters.size()
Mini и Minj не инициализируются. Если Distances[0][1] является минимумом, то эти переменные так и останутся неинициализированными.
Цитата Сообщение от Stille Посмотреть сообщение
Я пробовал так, как ты написал, ничего не изменилось, т.к. он никогда и не был меньше размера вектора. Я сделал чуть по другому:
вместо
C++
1
Clusters.erase(Clusters.begin() + Minj);
написал
C++
1
Clusters.erase(Clusters.end() - 1 - (Clusters.size() - Minj));
Эти строки не эквивалентны. Если Minj == 0, то вторая приведёт к ошибке. Первая приводит к ошибке если Minj >= Clusters.size(), но в целом первый вариант внушает больше доверия.
В общем, проверяй значения Minj и смотри при каких возникает ошибка.
2
Stille
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 5
31.08.2012, 22:07  [ТС] #9
Цитата Сообщение от grizlik78 Посмотреть сообщение
Mini и Minj не инициализируются. Если Distances[0][1] является минимумом, то эти переменные так и останутся неинициализированными.
Блин Вот это упущение! Это все и объясняет! Сейчас прогнал алгоритм 10 раз (по 100 итераций каждый) - ни одного вылета! Я уж было разочаровался в векторах Спасибо огромное!
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.09.2012, 01:33 #10
grizlik78, респект! это тот случай, когда головой. мне проще компьютером.
0
01.09.2012, 01:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 01:33
Привет! Вот еще темы с ответами:

Двумерный массив через вектор - C++
Задача состоит в том, что надо создать массив строк через вектор, т.е. я хочу иметь возмость изменять как количество строк, так и их длину.

.erase() в массиве. - C++
есть массив вектор например: vector&lt; pair&lt;char,int&gt; &gt; k; k.second мне надо его удалить как воспользоваться функции k.erase() ;...

vector::erase()? - C++
есть вектор структур struct person{ string name; int age; vector &lt;person&gt; repw;

vector.erase - C++
Помогите пожалуйста с синтаксисом удаления любого элемента из вектора Вот тут ошибка: #include &lt;vector.h&gt; void main() { ...


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

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

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