C++11 std::std::弱ptr插入和移除集

C++11 std::std::弱ptr插入和移除集,c++11,smart-pointers,C++11,Smart Pointers,在我的主应用程序中,我有一个std::set。我还想创建一个std::set的辅助集合,因为我不想增加引用计数,但我还想避免使用锁调用坏内存位置。不幸的是,我不能用std::weak_ptrs来定义std::set。这样做之后,编译器会抱怨insert和remove方法中存在一些错误 #include <memory> #include <set> #include <vector> class Test{ private: int x ; publi

在我的主应用程序中,我有一个
std::set
。我还想创建一个
std::set
的辅助集合,因为我不想增加引用计数,但我还想避免使用锁调用坏内存位置。不幸的是,我不能用
std::weak_ptr
s来定义
std::set
。这样做之后,编译器会抱怨insert和remove方法中存在一些错误

#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
}
#包括
#包括
#包括
课堂测试{
私人:
int x;
公众:
测试(INTX){
这个->x=x;
}
int getx(){
返回x;
}
};
int main(){
std::shared_ptr t=std::make_shared(10);
std::weak_ptr ref=std::weak_ptr(t);
std::set weakrefs;
weakrefs.insert(ref);//编译器错误
weakrefs.erase(ref);//编译器错误
}

但是当我使用
std::vector
时,我可以向后推和弹出。但我希望类似于
std::set

的功能要有一组
弱ptr
s,您需要
std::owner\u less
,一个特殊的比较运算符:

std::set<std::weak_ptr<Test>, std::owner_less<std::weak_ptr<Test>>> weakrefs;
std::set weakrefs;
此比较运算符使用管理区域查找智能指针,而不是指向它们指向的对象的指针。这是必要的,因为当智能指针仍在
std::set
中时,可以删除对象


实际上,您还应该使用
std::owner_less
作为一组
shared_ptr
s.

要获得一组
weak_ptr
s,您需要
std::owner_less
,一个特殊的比较运算符:

std::set<std::weak_ptr<Test>, std::owner_less<std::weak_ptr<Test>>> weakrefs;
std::set weakrefs;
此比较运算符使用管理区域查找智能指针,而不是指向它们指向的对象的指针。这是必要的,因为当智能指针仍在
std::set
中时,可以删除对象

实际上,您还应该使用
std::owner_less
作为一组
shared_ptr
s

但是当我使用std::vector>时,我可以推 回来,回来。但是我想要类似于std::set的功能

std::set
是一个有序容器。这意味着,当您插入某些内容时,数据结构需要进行一些比较以找到其正确的位置(在内部树中)。因此,正如@j6t所提到的,在定义集合时需要引入一个比较运算符。对于
std::vector
而言,情况并非如此,因为对于
std::vector
而言,您将一个接一个地保留元素,而不进行任何比较

但是当我使用std::vector>时,我可以推 回来,回来。但是我想要类似于std::set的功能


std::set
是一个有序容器。这意味着,当您插入某些内容时,数据结构需要进行一些比较以找到其正确的位置(在内部树中)。因此,正如@j6t所提到的,在定义集合时需要引入一个比较运算符。对于
std::vector
而言,情况并非如此,因为对于
std::vector
而言,您将一个接一个地保留元素,而不进行任何比较

是<代码> STD::unOrdEdTySt/<代码>一个选项?是的。除了…订购,它是否以任何方式改变了容器的功能?我想象通过排序它会保留一个唯一的对象t?我不知道你需要什么功能。但是,如果只想使用集合的属性(插入、查找、删除)。我认为无序设置是一个更好的选择。大多数情况下,它比有序的性能要好得多。<代码> STD::无序的SET/<代码>一个选项?是的。除了…订购,它是否以任何方式改变了容器的功能?我想象通过排序它会保留一个唯一的对象t?我不知道你需要什么功能。但是,如果只想使用集合的属性(插入、查找、删除)。我认为无序设置是一个更好的选择。大多数情况下,它的性能比订购的要好得多。编辑:我更改了代码,它确实工作了。谢谢。编辑:我更改了代码,它确实有效。非常感谢。