I'm使用下面的代碼層樓高一種註冊表類刪除一個元素:如何從矢量<shared_ptr>
class MyClass
{
public:
int a;
std::string b;
};
class Register
{
public:
std::vector<std::shared_ptr<MyClass>> items;
bool registerItem(std::shared_ptr<MyClass> item)
{
/*
* Check if item exists
*/
auto position = std::find(items.begin(), items.end(), item);
if (position != items.end())
return false;
items.push_back(item);
return true;
}
bool unregisterItem(std::shared_ptr<MyClass> item)
{
auto position = std::find(items.begin(), items.end(), item);
if (position == items.end())
return false;
items.erase(item);
return true;
}
};
int main()
{
std::shared_ptr<MyClass> item1 = new MyClass;
Register registry;
if (!registry.registerItem(item1))
std::cout << "Error registering item1" << std::endl;
else
std::cout << "Success registering item1" << std::endl;
if (!registry.registerItem(item1))
std::cout << "Error unregistering item1" << std::endl;
else
std::cout << "Success unregistering item1" << std::endl;
}
我不能編譯這段代碼,items.erase(item)
抱怨error: no matching member function for call to 'erase'
。
爲什麼我不能刪除我添加的對象。從std::vector
中刪除std::shared_ptr
的正確方法是什麼?
您擦除*迭代器*,而不是值本身。 –
爲註冊表使用矢量圖可能會變得昂貴;如書面所述,註冊N個項目需要'O(N^2)'時間。另一方面,內部循環速度快,存儲開銷最小。不過,如果你期望'N'很大,你可能想要考慮一個'std :: unordered_set'。 – rici