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