如何从集合中删除共享 ptr 元素?
how to remove a shared ptr element from set?
我有一个集合,其中集合中的每个元素都是类型 shared_ptr
,我想从集合中删除一个元素,在 eclipse 中该元素实际上被删除了,但是当我在 [=19] 中测试它时=] 使用 valgrind 我遇到了很多无效的大小错误...
所以这让我想到也许有一种不同的方法可以删除 shared_ptr
类型的元素?
peoplePointer 中的每个元素都是某个人的 class:
typedef std::shared_ptr<person> peoplePointer;
class AA {
std::set<peoplePointer> setOfPeople;
public:
// function getName() return name of the person (person is another class)
void removeSomeonefromA(const std::string& name) {
for (std::set<peoplePointer>::iterator it = setOfPeople.begin();it != setOfPeople.end(); it++) {
if(name == (*it).get()->getName()) {
setOfPeople.erase((it));
}
}
}
};
灵感来自 remove_if equivalent for std::map。
如果您能够使用 C++11 或更高版本的编译器,您可以使用:
void removeSomeonefromA(const string& name)
{
for (set<peoplePointer>::iterator it = setOfPeople.begin(); it != setOfPeople.end(); /* Empty */ )
{
if(name == (*it).get()->getName())
{
it = setOfPeople.erase(it);
}
else
{
++it;
}
}
}
如果您需要使用以前的编译器版本,您可以使用:
void removeSomeonefromA(const string& name)
{
for (set<peoplePointer>::iterator it = setOfPeople.begin(); it != setOfPeople.end(); /* Empty */ )
{
if(name == (*it).get()->getName())
{
setOfPeople.erase(it++);
}
else
{
++it;
}
}
}
我有一个集合,其中集合中的每个元素都是类型 shared_ptr
,我想从集合中删除一个元素,在 eclipse 中该元素实际上被删除了,但是当我在 [=19] 中测试它时=] 使用 valgrind 我遇到了很多无效的大小错误...
所以这让我想到也许有一种不同的方法可以删除 shared_ptr
类型的元素?
peoplePointer 中的每个元素都是某个人的 class:
typedef std::shared_ptr<person> peoplePointer;
class AA {
std::set<peoplePointer> setOfPeople;
public:
// function getName() return name of the person (person is another class)
void removeSomeonefromA(const std::string& name) {
for (std::set<peoplePointer>::iterator it = setOfPeople.begin();it != setOfPeople.end(); it++) {
if(name == (*it).get()->getName()) {
setOfPeople.erase((it));
}
}
}
};
灵感来自 remove_if equivalent for std::map。
如果您能够使用 C++11 或更高版本的编译器,您可以使用:
void removeSomeonefromA(const string& name)
{
for (set<peoplePointer>::iterator it = setOfPeople.begin(); it != setOfPeople.end(); /* Empty */ )
{
if(name == (*it).get()->getName())
{
it = setOfPeople.erase(it);
}
else
{
++it;
}
}
}
如果您需要使用以前的编译器版本,您可以使用:
void removeSomeonefromA(const string& name)
{
for (set<peoplePointer>::iterator it = setOfPeople.begin(); it != setOfPeople.end(); /* Empty */ )
{
if(name == (*it).get()->getName())
{
setOfPeople.erase(it++);
}
else
{
++it;
}
}
}