【问题标题】:How to erase a certain element from a shared_ptr to a vector of objects?如何将某个元素从 shared_ptr 擦除到对象向量?
【发布时间】:2018-06-22 05:52:54
【问题描述】:

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

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

为了从向量 (members) 中删除某个 User 对象,我在类 Group 中创建了一个成员函数 (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 的特殊规则?)?有没有更好/最优的方法?

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

【问题讨论】:

  • 您的删除实现会跳过元素。最好改用std::remove
  • auto &amp;vec = *members; 怎么样,那么 vec 可以作为正则向量。请注意,无论你做什么操作,它都不是线程安全的。

标签: c++ class vector shared-ptr


【解决方案1】:

首先,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++;
}

【讨论】:

  • 谢谢。那工作得很好。好建议,我没有看到关于边界或下一个元素跳过的问题。
【解决方案2】:

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

#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;
}

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多