我嘗試使用std ::刪除(我讀過關於這個算法here和here)和目錄::擦除和性病的組合移除從列表中elemetns(指向一個名爲類型)::找到。我應該使用std :: remove從列表中刪除元素嗎?
下面是我寫的這個目的的代碼:
#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(02);:
Removing o2 object from objectList1 with remove
o1: NamedType::update()
o3: NamedType::update()
o4: NamedType::update()
o4: NamedType::update()
我無法理解的文檔:我得到的,有顯示範圍的新結束一個NEW_END迭代器,但如果我有多個相同NamedTypes這不工作,那麼。例如。如果我在objectList1中註冊了兩次對象o2,它將是可見的,並且它的成員函數將由namedObjectsInfo()方法調用,因爲它遍歷所有元素(它看不到new_end迭代器)。
如果我的理解是正確的,應該我甚至使用std ::刪除從容器,或性病的組合刪除元素::查找和列表::在這種情況下刪除?