如何将 shared_ptr 中的某个元素擦除为对象向量?

How to erase a certain element from a shared_ptr to a vector of objects?

我已经创建了一个成员变量(在 class Group 中),它是一个 shared_ptr 到向量(称为 members 存储类型 User(一个不同的class)。这里是成员变量定义(空):

std::shared_ptr <std::vector<User>> members = std::make_shared<std::vector<User>>();

为了从向量(members)中消除某个User对象,我在classGroup中创建了一个成员函数(remove) .它检查矢量内的所有 User 对象,当遇到具有正在查找的 a.URI 值的对象时,它会擦除​​矢量中该位置的对象。

void Group::remove(User a) {
    for (auto i = 0; i < members->size(); i++){
        if (a.URI == (*(members->begin()+i)).URI) members->erase(*(members->begin() + i));
    }

这是我现在的 remove 功能,但它不起作用。我已经检查了不同的配置,但无法使其正常工作。我的功能有问题吗?这个功能应该如何实现(shared_ptr的特殊规则?)?有 better/optimal 方法吗?

我认为这里不需要更多的代码来解决我的问题。但是,对于那些想要 MCV 示例的人,我试着写了一个 here (Ideone)。

首先,std::vector::erase需要一个迭代器作为它的参数,所以改变

members->erase(*(members->begin() + i))

members->erase(members->begin() + i)

其次,元素被擦除后,在计算i++时,你将跳过下一个元素或离开vector的边界。您可以将循环更改为

for (auto i = 0; i < members->size(); ) {
    if (a.URI == (*(members->begin()+i)).URI) 
        members->erase(members->begin() + i);
    else
        i++;
}

为什么不将向量 members 声明为组 class 的静态成员。我是这样做的:

#include <bits/stdc++.h>    
using namespace std;

class User{
public:
    int URI;
    User(int a){
        URI = a;
    }
};

class Group {
public:
    static vector<User> members;
    void remove(User a) {
        for (int i = 0; i < members.size();){
            if (a.URI == (*(members.begin()+i)).URI) members.erase((members.begin() + i));
            else
                i++;
        }
    }
    Group(User a, User b, User c){
        members.push_back(a); 
        members.push_back(b);
        members.push_back(c);
    }
};

vector<User> Group::members;

int main() {
    User a(1), b(2), c(3);
    Group obj(a, b, c);

    obj.remove(a);
    return 0;
}

希望对您有所帮助。