C++ 向量::使用类对象迭代器擦除不擦除向量成员

c++ vector::erase with class object iterator not erasing vector member

本文关键字:擦除 向量 成员 迭代器 C++ 对象      更新时间:2023-10-16

我知道这个问题与其他问题相似,但我看了这里和这里,这些都没有解决我的问题。我能够找到的一切都表明以下代码应该可以工作。我用于测试的向量具有名称为超人、蝙蝠侠和蜘蛛侠的元素。我不认为该示例无法删除更多代码以使其有意义。

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 = "OKrn";
            write(fd, msg, strlen(msg));
            return;
          }
        }
      }
    }

房间对象具有 user 类型的向量。 roomIt->getUsers()返回房间中用户的向量。但是,最里面的 if 语句不执行任何操作。为了调试,我有一个 3 个用户的向量。使用 gdb 时,我可以看到useIt = roomIt->getUsers().erase(useIt)导致迭代器从向量中的第二个元素移动到第三个元素。但是,矢量不会改变。之前有3个元素,之后也有3个元素。

正如user2328447在评论中推测的那样,您的getUsers是按值而不是引用返回的。因此,每次调用它时,都会得到一个完全不相关的vector(相同的值,但单独存储(;甚至你的循环结构也是错误的(它将vector的一个副本的.begin()与单独副本的.end()进行比较(。

如果您希望能够从调用方更改实例的vector,则必须返回引用,更改:

vector<User> Room::getUsers() {return users;}

自:

vector<User>& Room::getUsers() {return users;}
            ^ return reference, not value