我知道这个问题与其他人类似,但我看了here和here,但这些都没有解决我的问题。我能找到的所有内容都表明以下代码应该可行。 我用于测试的向量包含名称为superman,batman和spiderman的元素。我不能删除任何更多的示例代码以使我有意义。
class Room{
vector<User> users;
users = {{superman, pass}, {batman, pass}, {spiderman, pass}};
public:
vector<User> Room::getUsers() {return users;}
};
class User{
string username;
string pass;
};
// Find the room. Once found, scan through the users
// Once the user is found, remove them from the vector
for(roomIt = rooms.begin(); roomIt < rooms.end(); roomIt++) {
if (roomIt->getName().compare(roomName) == 0) {
for (useIt = roomIt->getUsers().begin(); useIt < roomIt->getUsers().end(); useIt++) {
if (useIt->getName().compare(username) == 0) {
useIt = roomIt->getUsers().erase(useIt);
const char * msg = "OK\r\n";
write(fd, msg, strlen(msg));
return;
}
}
}
}
房间对象有一个user类型的向量。 roomIt->getUsers()
返回房间中的用户向量。然而,最里面的if语句并没有做任何事情。要调试,我有一个3用户的向量。使用gdb时,我可以看到useIt = roomIt->getUsers().erase(useIt)
导致迭代器从向量中的第二个元素移动到第三个元素。但是,矢量不会改变。预先有3个元素,之后也有3个元素。
答案 0 :(得分:0)
作为user2328447 speculated in the comments,getUsers
按值返回,而不是引用。因此,每次调用它时,都会得到一个完全不相关的vector
(相同的值,但是单独存储);甚至你的循环结构也是错误的(它将.begin()
从vector
的一个副本与单独副本的.end()
进行比较。
如果您希望能够从调用者变异实例vector
,则必须返回引用,更改:
vector<User> Room::getUsers() {return users;}
为:
vector<User>& Room::getUsers() {return users;}
^ return reference, not value