2013-05-22 79 views
1

使用:Eclipse 3.8.1,C/C++遠程調試啓動6.0.0,GCC 1.1.0和GDB 7.0.0 已驗證:Visual Studio 2010C++ STL vector.erase()總是刪除最後一個元素

我正在拉我的頭髮在這一個。使用以下代碼時,房間對象房間的矢量的最後一個元素始終被刪除。除了最後一個使用此代碼擦除之外,我無法獲得任何其他元素。我只是試圖刪除一個元素(該位置由用戶確定)。

我知道很多人可能會問爲什麼我不使用列表,但隨機數據訪問比使用此集合輕鬆添加/刪除元素要重要得多。你有什麼想法?

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

相關問題