2016-01-02 2 views
1

Я сортирую пункты, код, который я написал для сортирующей части, отлично работает, но у меня есть одна проблема. Каждое так часто (случайное время) случайные точки добавляются в конец вектора, и когда я пытаюсь pop_back() удалить эти последние элементы (потому что я написал небольшую часть, чтобы проверить, чтобы количество точек было тоже), я заканчиваю бесконечным циклом, пытаясь удалить эти последние элементы, которые просто не исчезнут. Есть что-то, что я должен знать? Также некоторые точки случайно исчезают, даже когда я не пытаюсь их удалить. Я пытаюсь понять, что мне нужно сделать, чтобы предотвратить появление этих странных точек, потому что эти точки сортируются в определенном порядке.std :: вектор случайным образом добавляет элементы в вектор

У меня есть только три способа вставки, а первая является emplace_back(), следующий вставки, а последний является также метод вставки:

   if (afterX >= spheres.capacity()) 
        spheres.emplace_back(center); 
       else if(afterX == -1) 
        spheres.insert(spheres.begin(),center); 
       else 
        spheres.insert(std::next(spheres.begin(), afterX),center); 
       elementCount++; 

Вот мой выход, чтобы получить идея:

Point: <5,0,0> 
zFind: -1 
<5,0,0> 
Point: <10,0,0> 
zFind: 0 
yFind: 0 
<5,0,0><10,0,0> 
Point: <100,0,0> 
zFind: 0 
yFind: 0 
<5,0,0><10,0,0><100,0,0><2.11207e-023,0,0> 
Point: <30,0,0> 
zFind: 0 
yFind: 0 
<5,0,0><10,0,0><30,0,0><100,0,0> 
Point: <20,0,0> 
zFind: 0 
yFind: 0 
<5,0,0><10,0,0><20,0,0><30,0,0><100,0,0><2.10934e-023,2.21351e+033,0><0,0,2.21351e+033><0,0,0> 

Как вы можете видеть точку: Point корректно добавляется в серии (наименьшего к наибольшему), но это нечетные дополнительные цифры в конце, которые тут же исчезают.

Спасибо, Simon

+3

Скорее всего, вставка и удаление элементов из вектора аннулирует все существующие итераторы. Но, не видя кода, будет трудно дать реальный ответ. –

+0

Просто отбросьте элементы и выполните сортировку. Упрощает код. –

ответ

3

Вы используете capacity где вы должны использовать size. capacity возвращает число , выделенное элементов в векторе, которое может быть больше количества элементов, хранящихся в векторе (то есть size). Доступ к элементам, находящимся в конце size, является неопределенным поведением

Когда вы добавляете элемент в вектор, где size() == capacity(), будет выделена новая память для хранения всего вектора (из того, что вы показываете выше, ваша реализация удваивает емкость когда это необходимо). Старый контент скопирован в новую память, а новый элемент добавлен в.

Нечетные дополнительные номера - это то, что происходит в неинициализированной памяти, которая была выделена для нового контента.

В обычном порядке использования vector вам редко приходится обращаться к capacity.

+0

Спасибо !!!! Это помогает!!!! – simonfrfr

Смежные вопросы