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

时间:2018-04-10 21:14:52

标签: c++ class vector iterator erase

我知道这个问题与其他人类似,但我看了herehere,但这些都没有解决我的问题。我能找到的所有内容都表明以下代码应该可行。 我用于测试的向量包含名称为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个元素。

1 个答案:

答案 0 :(得分:0)

作为user2328447 speculated in the commentsgetUsers按值返回,而不是引用。因此,每次调用它时,都会得到一个完全不相关的vector(相同的值,但是单独存储);甚至你的循环结构也是错误的(它将.begin()vector的一个副本与单独副本的.end()进行比较。

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

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

为:

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