2013-05-22 4 views
1

Использование: Eclipse 3.8.1, C/C++ Remote Debug Launcher 6.0.0, с GCC 1.1.0 и GDB 7.0.0 Проверено на: Visual Studio 2010C++ STL vector.erase() всегда удаляет последний элемент

Я тяну свои волосы на этом. При использовании следующего кода последний элемент вектора объектов Room номеров всегда удаляется. Я не могу получить какой-либо элемент, отличный от последнего, чтобы удалить этот код. Я только пытаюсь удалить один элемент (местоположение определяется пользователем).

Я знаю, что многие из вас, вероятно, спрашивают, почему я не использую список, но случайный доступ к данным гораздо важнее, чем простота добавления и удаления элементов в этой коллекции. У тебя есть идеи?

void House::removeRoom(unsigned int roomToRemove){ 
    try{ 
     if(roomDoesNotExist(roomToRemove)) throw houseException("Room requested to  remove does not exist", roomToRemove, __FILE__, __LINE__); 

     vector<Room>::iterator roomIterator = rooms.begin() + roomToRemove; 
     rooms.erase(roomIterator); 

     removeAllLinksToRoom(roomToRemove); 
     renumberLinkedRoomsAfterErase(roomToRemove); 
    } 
    catch(houseException& hException){ 
     hException.display(cerr); 
    } 
} 

Вот отрывок из класса дома:

#include "Room.h" 

using namespace std; 

class House { 
public: 
    vector<Room> rooms; 

    //member functions 
    void removeRoom(unsigned int roomToRemove); 


    //constuctors/destructors 
    House(); 
    virtual ~House(); 

    //STL linked list overload operators =, ==, and < 
    House &operator=(const House &rhs); 
    int operator==(const House &rhs) const; 
    int operator<(const House &rhs) const; 

private: 
    bool roomDoesNotExist(int roomToRemove); 
    void removeAllLinksToRoom(int roomToUnlink); 
    void renumberLinkedRoomsAfterErase(int erasedRoom); 
}; 

Потому что это может быть уместным, я включил весь свой класс номер:

#include "Wall.h" 

#include <vector> 
#include <algorithm> 
#include <string> 

#include "exceptions/houseException.h" 

using namespace std; 

class Room { 
    public: 
    float setPointDegF; 
    vector<Wall> walls; //TODO consider making walls protected/private 

    private: 
    string roomName; 
    vector<int> linkedRooms; 
    float storedTemperature; 
    float storedHumidity; 

    //member functions 
    void linkToRoom(int roomToLink); 
    void unlinkFromRoom(int roomToUnlink); 

    void removeAllLinksToRoom(int roomToUnlink); 
    void renumberLinkedRoomsAfterErase(int erasedRoom); 

public: 
    //friends 
    friend class House; 

    //member functions 
    void addWalls(unsigned int numWallsToAdd=1); 
    void removeWall(unsigned int wallToRemove); 

    //Sensor Functions 
    void readSensorTemperature(); 
    void readSensorHumidity(); 

    void temperature(); 
    void humidity(); 

    //constuctors/destructors 
    Room(); 
    virtual ~Room(); 
//STL linked list overload operators =, ==, and < 
    Room &operator=(const Room &rhs); 
    int operator==(const Room &rhs) const; 
    int operator<(const Room &rhs) const; 
private: 
    void getAttachedRooms(Wall& tempWall); 

    bool wallDoesNotExist(unsigned int wallToRemove); 
    bool roomLinked(int roomToLink); 
    bool roomNotLinked(int roomToLink); 

    vector<int>::iterator findRoom(int roomToFind); 
    vector<int>::iterator findInsertionPoint(int roomToInsert); 


}; 
+0

Что содержит ваш вектор и какой индекс передан? – chris

+4

* «Я знаю, что многие из вас, вероятно, спрашивают, почему я не использую список» * - Нет, мы не знаем. Использования для связанных списков немногочисленны и далеки друг от друга, и в курсах CS они чрезмерно подчеркиваются. –

+2

Трудно ответить, потому что столько кода отсутствует. Вы понимаете, что это 'rooms.erase (roomIterator);' сдвинет все элементы после RoomToRemove влево. Так что если RoomToRemove - 4, все, что было в комнатах [5], теперь находится в комнате [4]. – Guillaume

ответ

1

n.m. ответил на это в комментариях ниже мой вопрос, но я перепечатывать его здесь для ясности:

Кроме того, имеет ли класс номер есть оператор присваивания и конструктор копирования определен правильно? - н.м.

Ответ: Нет. Явный оператор присвоения номера помещения вызывал проблему.

Я попытался перегрузить оператор присваивания по умолчанию и не смог ужасно. Когда я прокомментировал этот код и использовал неявный оператор & = , жизнь хорошая. Задача решена. -neghzero

1

rooms.erase(roomIterator) удалит элемент на месте roomIterator. Если вы хотите удалить все элементы с начала до roomToRemove, используйте rooms.erase(rooms.begin(), rooms.begin()+roomToRemove) или rooms.erase(rooms.begin(), roomIterator)

+0

Я собираюсь предложить, что само название функции является сильным индикатором, который он пытается удалить из одной комнаты * одного *. – WhozCraig

+0

@WhozCraig да, вы можете быть верны. Но когда я читаю «Я не могу получить какой-либо элемент, отличный от последнего, чтобы удалить этот код». - Я понял, что он пытается удалить более одного или, по крайней мере, не только последний элемент ... Возможно, я ошибаюсь , – Bill

+0

Извините, что не ясны. Я просто пытаюсь удалить один элемент в векторном контейнере. – neghzero

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