如何将 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;
}
希望对您有所帮助。
我已经创建了一个成员变量(在 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;
}
希望对您有所帮助。