C++ 向量::使用类对象迭代器擦除不擦除向量成员
c++ vector::erase with class object iterator not erasing vector member
我知道这个问题与其他问题相似,但我看了这里和这里,这些都没有解决我的问题。我能够找到的一切都表明以下代码应该可以工作。我用于测试的向量具有名称为超人、蝙蝠侠和蜘蛛侠的元素。我不认为该示例无法删除更多代码以使其有意义。
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
相关文章:
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 分割错误:向量中的擦除功能
- 如何使用擦除和迭代器来删除二维向量中的项目
- 从向量和对向量中擦除元素的差异
- 如何将某个元素从shared_ptr擦除到对象向量?
- 如何根据某些值擦除/删除类对象的向量
- 给定一个向量,擦除低于 itemsnum 的元素
- C++ 向量::使用类对象迭代器擦除不擦除向量成员
- C 矢量元素擦除与新向量创建
- 从向量中擦除元素是否也会擦除元素中存在的所有成员向量
- 向量擦除功能无法正常工作
- 使用迭代器时遇到问题,每 M 次传递一次擦除一个向量项
- 如何更有效地从向量或集合中擦除元素?
- 插入排序与插入/擦除?(所以我需要对一个向量进行排序,而不是手工做事,而是使用插入和擦除
- 使用擦除-删除范例将元素从一个向量移动到另一个向量
- 当我在c++中擦除向量时,我遇到了双自由错误
- 用算法擦除向量中的特定元素
- 在这种情况下如何擦除向量元素
- 如何擦除向量的一部分
- 如何查找和擦除向量元素中的某个字符