C++ 如何将共享的ptr中的某个元素擦除为对象向量?

C++ 如何将共享的ptr中的某个元素擦除为对象向量?,c++,class,vector,shared-ptr,C++,Class,Vector,Shared Ptr,我已经创建了一个成员变量(在类组中),它是一个共享的\u ptr向量(称为成员,存储类型为用户的对象(另一个类)。以下是成员变量定义(空): 这是我的remove功能,但它不起作用。我检查了不同的配置,但无法使其起作用。我的功能有问题吗?该如何实现此功能(共享的ptr的特殊规则)?有更好/最佳的方法吗 我认为这里不需要更多的代码来解决我的问题。但是,对于那些想要一个MCV示例的人,我尝试编写一个(Ideone)。首先,需要一个迭代器作为其参数,所以请更改 members->erase(*(

我已经创建了一个成员变量(在类
中),它是一个
共享的\u ptr
向量(称为
成员
,存储类型为
用户
的对象(另一个类)。以下是成员变量定义(空):

这是我的
remove
功能,但它不起作用。我检查了不同的配置,但无法使其起作用。我的功能有问题吗?该如何实现此功能(共享的ptr的特殊规则)?有更好/最佳的方法吗

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

首先,需要一个迭代器作为其参数,所以请更改

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

其次,在删除元素后,当计算
i++
时,您将跳过下一个元素或跳出
向量的界限。您可以将循环更改为

for (auto i = 0; i < members->size(); ) {
    if (a.URI == (*(members->begin()+i)).URI) 
        members->erase(members->begin() + i);
    else
        i++;
}
for(自动i=0;isize();){
if(a.URI==(*(members->begin()+i)).URI)
成员->删除(成员->开始()+i);
其他的
i++;
}

为什么不将vector
成员声明为group类的静态成员。我是这样做的:

#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;
}
#包括
使用名称空间std;
类用户{
公众:
int-URI;
用户(INTA){
URI=a;
}
};
班级{
公众:
静态向量成员;
作废删除(用户a){
对于(int i=0;i

希望有帮助。

您的remove实现跳过元素。最好使用
std::remove
而不是
auto&vec=*members;
那么vec可以用作常规向量。请注意,无论您做什么操作,它都不是线程安全的。谢谢。这很好。还有一个好的建议,我没有看到关于边界的问题或者跳过下一个元素。
members->erase(members->begin() + i)
for (auto i = 0; i < members->size(); ) {
    if (a.URI == (*(members->begin()+i)).URI) 
        members->erase(members->begin() + i);
    else
        i++;
}
#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;
}