使用: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);
};
你的向量包含什麼以及傳遞的索引是什麼? – chris
*「我知道你們很多人可能會問爲什麼我不使用列表」 - - 不,我們不是。鏈接列表的使用很少,而且在CS課程中過分強調。 –
很難回答,因爲缺少很多代碼。你確實知道'rooms.erase(roomIterator);'會將roomToRemove之後的所有元素轉移到左邊。所以如果roomToRemove是4,那麼房間[5]上的任何東西現在都在房間[4]。 – Guillaume