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_ptrstd::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_ptrs。

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 ,您将元素一个接一个地保留,没有任何比较。