gpt4 book ai didi

c++ - 我应该使用 std::remove 从列表中删除元素吗?

转载 作者:太空宇宙 更新时间:2023-11-04 14:56:00 31 4
gpt4 key购买 nike

我试过使用 std::remove (我读过这个算法 herehere )以及 list::erase 和标准::找到。

这是我为此编写的代码:

#include <iostream>

#include <list>
#include <functional>
#include <string>
#include <algorithm>


class NamedType
{
std::string name_;

public:
NamedType (const char* name)
:
name_(name)
{}

void info()
{
std::cout << name_ << ": NamedType::update()" << std::endl;
}
};

class NamedTypeList
{
std::list<NamedType*> objectList_;

public:

void addNamedType(NamedType& o)
{
NamedType* oPtr = &o;
objectList_.push_back(oPtr);
}

void removeNamedTypeWithFind(NamedType& o)
{
std::list<NamedType*>::iterator removedNamedType = std::find(
objectList_.begin(), objectList_.end(), &o);

if (removedNamedType != objectList_.end())
{
objectList_.erase(removedNamedType);
}
}

void removeNamedType(NamedType& o)
{
std::remove(objectList_.begin(), objectList_.end(), &o);
}

void namedObjectsInfo()
{
std::for_each(objectList_.begin(), objectList_.end(),
std::mem_fun(&NamedType::info));
}
};

using namespace std;

int main ()
{
NamedType o1("o1");
NamedType o2("o2");
NamedType o3("o3");
NamedType o4("o4");

NamedTypeList objectList1;
NamedTypeList objectList2;

objectList1.addNamedType(o1);
objectList1.addNamedType(o2);
objectList1.addNamedType(o3);
objectList1.addNamedType(o4);

objectList2.addNamedType(o1);
objectList2.addNamedType(o2);
objectList2.addNamedType(o3);
objectList2.addNamedType(o4);

cout << "Registered objects into objectList1:" << endl;
objectList1.namedObjectsInfo();

cout << "Registered objects into objectList2:" << endl;
objectList2.namedObjectsInfo();

cout << "Removing o2 object from objectList1 with remove" << endl;

objectList1.removeNamedType(o2);
objectList1.namedObjectsInfo();


cout << "Removing o2 object from objectList2 with std::find" << endl;

objectList2.removeNamedTypeWithFind(o2);
objectList2.namedObjectsInfo();

};

我不明白的是为什么我在调用 objectList1.removeNamedType(o2); 时得到以下输出:

Removing o2 object from objectList1 with remove
o1: NamedType::update()
o3: NamedType::update()
o4: NamedType::update()
o4: NamedType::update()

我在理解文档时遇到了问题:我知道有一个 new_end 迭代器显示范围的新结束,但是如果我有多个相同的 NamedType,这就不起作用了。例如。如果我在 objectList1 中注册对象 o2 两次,它将是可见的,并且它的成员函数将被 namedObjectsInfo() 方法调用,因为它遍历所有元素(它没有看到 new_end 迭代器)。

如果我理解正确,我是否应该使用 std::remove 从容器中删除元素,或者在这种情况下结合使用 std::find 和 list::erase?

最佳答案

当容器有自己的 remove 方法时,如 std::list 那样,你应该使用它而不是 std::remove .对于没有 remove 方法的容器,您应该使用此处其他答案中描述的 erase-remove 习语。

关于c++ - 我应该使用 std::remove 从列表中删除元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14045404/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com