std::set 个 std::weak_ptr 个插入和删除
std::set of std::weak_ptr insert and remove
在我的主应用程序中,我有一个 std::set<std::shared_ptr<Object>>
。我还想创建一个辅助集 std::set<std::weak_ptr<Object>>
因为我不想增加引用计数,但我也想避免通过使用锁调用错误的内存位置。不幸的是,我无法在内部定义一个带有 std::weak_ptr
的 std::set
。这样做之后,编译器会抱怨插入和删除方法中的一些错误。
#include <memory>
#include <set>
#include <vector>
class Test{
private:
int x ;
public:
Test(int x){
this->x = x;
}
int getx(){
return x;
}
};
int main(){
std::shared_ptr<Test> t = std::make_shared<Test>(10);
std::weak_ptr<Test> ref = std::weak_ptr<Test>(t);
std::set<std::weak_ptr<Test>> weakrefs;
weakrefs.insert(ref);//compiler error
weakrefs.erase(ref);//compiler error
}
但是当我使用 std::vector<std::weak_ptr<Test>>
时,我可以向后推和弹出。但我想要与 std::set
.
类似的功能
要有一组weak_ptr
,你需要std::owner_less<>
,一个特殊的比较运算符:
std::set<std::weak_ptr<Test>, std::owner_less<std::weak_ptr<Test>>> weakrefs;
这个比较运算符使用管理区域来查找智能指针,而不是指向它们所指向的对象的指针。这是必要的,因为可以在智能指针仍在 std::set
.
中时删除对象
你实际上也应该使用 std::owner_less
一组 shared_ptr
s。
But when I use std::vector< std::weak_ptr< Test>>, I'm allowed to push
back and pop back. But I would like similar functionality to std::set.
std::set
是有序容器。这意味着当你插入一些东西时,数据结构需要进行一些比较才能找到它的正确位置(在内部树中)。因此,正如@j6t 所提到的,您需要在定义集合时引入一个比较运算符。 std::vector
不是这种情况,因为对于 std::vector
,您将元素一个接一个地保留,没有任何比较。
在我的主应用程序中,我有一个 std::set<std::shared_ptr<Object>>
。我还想创建一个辅助集 std::set<std::weak_ptr<Object>>
因为我不想增加引用计数,但我也想避免通过使用锁调用错误的内存位置。不幸的是,我无法在内部定义一个带有 std::weak_ptr
的 std::set
。这样做之后,编译器会抱怨插入和删除方法中的一些错误。
#include <memory>
#include <set>
#include <vector>
class Test{
private:
int x ;
public:
Test(int x){
this->x = x;
}
int getx(){
return x;
}
};
int main(){
std::shared_ptr<Test> t = std::make_shared<Test>(10);
std::weak_ptr<Test> ref = std::weak_ptr<Test>(t);
std::set<std::weak_ptr<Test>> weakrefs;
weakrefs.insert(ref);//compiler error
weakrefs.erase(ref);//compiler error
}
但是当我使用 std::vector<std::weak_ptr<Test>>
时,我可以向后推和弹出。但我想要与 std::set
.
要有一组weak_ptr
,你需要std::owner_less<>
,一个特殊的比较运算符:
std::set<std::weak_ptr<Test>, std::owner_less<std::weak_ptr<Test>>> weakrefs;
这个比较运算符使用管理区域来查找智能指针,而不是指向它们所指向的对象的指针。这是必要的,因为可以在智能指针仍在 std::set
.
你实际上也应该使用 std::owner_less
一组 shared_ptr
s。
But when I use std::vector< std::weak_ptr< Test>>, I'm allowed to push back and pop back. But I would like similar functionality to std::set.
std::set
是有序容器。这意味着当你插入一些东西时,数据结构需要进行一些比较才能找到它的正确位置(在内部树中)。因此,正如@j6t 所提到的,您需要在定义集合时引入一个比较运算符。 std::vector
不是这种情况,因为对于 std::vector
,您将元素一个接一个地保留,没有任何比较。