在我的主应用程序中,我有一个 std::set<std::shared_ptr<Object>>
. 我还想创建一套辅助的 std::set<std::weak_ptr<Object>>
因为我不想递增引用计数,但我也想避免使用锁来调用坏的内存位置。不幸的是,我不能定义一个 std::set
与 std::weak_ptr
的内部。这样做后,编译器在插入和删除方法中出现了一些错误。
#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.
但是当我使用std::vector<std::weak_ptr<Test>>时,我可以推后和弹回。但我希望有类似于std::set的功能。
std::set
是一个有序的容器。这意味着当你插入一些东西时,数据结构需要一些比较来找到它的正确位置(在内部树内)。正因为如此,正如 @j6t 所提到的,你需要在定义 set 的同时引入一个比较操作符。这对于 std::vector
因为 std::vector
你把元素一个接一个地保留下来,不做任何比较。