c++ vector::erase with class object iterator not erasing vector member
c++ vector::erase with class object iterator not erasing vector member
我知道这个问题与其他问题类似,但我查看了 here and here,但这些都没有解决我的问题。我能找到的所有内容都表明以下代码应该有效。
我用于测试的矢量包含名称为超人、蝙蝠侠和蜘蛛侠的元素。我不能再为该示例删除任何我认为没有意义的代码。
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;
}
}
}
}
房间对象有一个用户类型的向量。 roomIt->getUsers()
returns 房间中用户的向量。然而,最里面的 if 语句什么都不做。为了调试,我有一个包含 3 个用户的向量。使用 gdb 时,我可以看到 useIt = roomIt->getUsers().erase(useIt)
导致迭代器从向量中的第二个元素移动到第三个元素。但是,矢量不会改变。前有3个元素,后有3个元素。
因为 你的 getUsers
是 return 按值而不是引用。所以每次你调用它,你都会得到一个完全不相关的 vector
(相同的值,但分开存储);甚至你的循环结构也是错误的(它将 vector
的一份副本中的 .begin()
与单独副本的 .end()
进行比较)。
如果您希望能够从调用方改变实例的 vector
,您必须 return 引用,更改:
vector<User> Room::getUsers() {return users;}
至:
vector<User>& Room::getUsers() {return users;}
^ return reference, not value
我知道这个问题与其他问题类似,但我查看了 here and here,但这些都没有解决我的问题。我能找到的所有内容都表明以下代码应该有效。 我用于测试的矢量包含名称为超人、蝙蝠侠和蜘蛛侠的元素。我不能再为该示例删除任何我认为没有意义的代码。
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;
}
}
}
}
房间对象有一个用户类型的向量。 roomIt->getUsers()
returns 房间中用户的向量。然而,最里面的 if 语句什么都不做。为了调试,我有一个包含 3 个用户的向量。使用 gdb 时,我可以看到 useIt = roomIt->getUsers().erase(useIt)
导致迭代器从向量中的第二个元素移动到第三个元素。但是,矢量不会改变。前有3个元素,后有3个元素。
因为 getUsers
是 return 按值而不是引用。所以每次你调用它,你都会得到一个完全不相关的 vector
(相同的值,但分开存储);甚至你的循环结构也是错误的(它将 vector
的一份副本中的 .begin()
与单独副本的 .end()
进行比较)。
如果您希望能够从调用方改变实例的 vector
,您必须 return 引用,更改:
vector<User> Room::getUsers() {return users;}
至:
vector<User>& Room::getUsers() {return users;}
^ return reference, not value