精华内容
下载资源
问答
  • UNIQUE

    2019-10-24 12:54:58
    UNIQUE
  • C++ 智能指针 unique_ptr 详解与示例

    万次阅读 多人点赞 2018-12-22 23:24:16
    在本文中,我们将讨论由C++11提供的智能指针std :: unique_ptr<>。 unique_ptr <>是C++ 11提供的用于防止内存泄漏的智能指针中的一种...

    unique_ptrC++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针。unique_ptr对象包装一个原始指针,并负责其生命周期。当该对象被销毁时,会在其析构函数中删除关联的原始指针。
    unique_ptr具有->*运算符重载符,因此它可以像普通指针一样使用。
    查看下面的示例:

    #include <iostream>
    #include <memory>
    
    struct Task {
        int mId;
        Task(int id ) :mId(id) {
            std::cout << "Task::Constructor" << std::endl;
        }
        ~Task() {
            std::cout << "Task::Destructor" << std::endl;
        }
    };
    
    int main()
    {
        // 通过原始指针创建 unique_ptr 实例
        std::unique_ptr<Task> taskPtr(new Task(23));
    
        //通过 unique_ptr 访问其成员
        int id = taskPtr->mId;
        std::cout << id << std::endl;
    
        return 0;
    }
    

    输出:

    Task::Constructor
    23
    Task::Destructor
    

    unique_ptr <Task> 对象 taskPtr 接受原始指针作为参数。现在当main函数退出时,该对象超出作用范围就会调用其析构函数,在unique_ptr对象taskPtr 的析构函数中,会删除关联的原始指针,这样就不用专门delete Task对象了。
    这样不管函数正常退出还是异常退出(由于某些异常),也会始终调用taskPtr的析构函数。因此,原始指针将始终被删除并防止内存泄漏。

    unique_ptr 独享所有权

    unique_ptr对象始终是关联的原始指针的唯一所有者。我们无法复制unique_ptr对象,它只能移动。
    由于每个unique_ptr对象都是原始指针的唯一所有者,因此在其析构函数中它直接删除关联的指针,不需要任何参考计数。

    创建一个空的 unique_ptr 对象

    创建一个空的unique_ptr<int>对象,因为没有与之关联的原始指针,所以它是空的。

    std::unique_ptr<int> ptr1;
    

    检查 unique_ptr 对象是否为空

    有两种方法可以检查 unique_ptr 对象是否为空或者是否有与之关联的原始指针。

    // 方法1
    if(!ptr1)
    	std::cout<<"ptr1 is empty"<<std::endl;
    // 方法2
    if(ptr1 == nullptr)
    	std::cout<<"ptr1 is empty"<<std::endl;
    

    使用原始指针创建 unique_ptr 对象

    要创建非空的 unique_ptr 对象,需要在创建对象时在其构造函数中传递原始指针,即:

    std::unique_ptr<Task> taskPtr(new Task(22));
    

    或者(这种新学到的)

    std::unique_ptr<Task> taskPtr(new std::unique_ptr<Task>::element_type(23));
    

    不能通过赋值的方法创建对象,下面的这句是错误的

    // std::unique_ptr<Task> taskPtr2 = new Task(); // 编译错误
    

    使用 std::make_unique 创建 unique_ptr 对象 / C++14

    std::make_unique<>() 是C++ 14 引入的新函数

    std::unique_ptr<Task> taskPtr = std::make_unique<Task>(34);
    

    获取被管理对象的指针

    使用get()·函数获取管理对象的指针。

    Task *p1 = taskPtr.get();
    

    重置 unique_ptr 对象

    在 unique_ptr 对象上调用reset()函数将重置它,即它将释放delete关联的原始指针并使unique_ptr 对象为空。

    taskPtr.reset();
    

    unique_ptr 对象不可复制

    由于 unique_ptr 不可复制,只能移动。因此,我们无法通过复制构造函数或赋值运算符创建unique_ptr对象的副本。

    // 编译错误 : unique_ptr 不能复制
    std::unique_ptr<Task> taskPtr3 = taskPtr2; // Compile error
    
    // 编译错误 : unique_ptr 不能复制
    taskPtr = taskPtr2; //compile error
    

    转移 unique_ptr 对象的所有权

    我们无法复制 unique_ptr 对象,但我们可以转移它们。这意味着 unique_ptr 对象可以将关联的原始指针的所有权转移到另一个 unique_ptr 对象。让我们通过一个例子来理解:

    // 通过原始指针创建 taskPtr2
    std::unique_ptr<Task> taskPtr2(new Task(55));
    // 把taskPtr2中关联指针的所有权转移给taskPtr4
    std::unique_ptr<Task> taskPtr4 = std::move(taskPtr2);
    // 现在taskPtr2关联的指针为空
    if(taskPtr2 == nullptr)
    	std::cout<<"taskPtr2 is  empty"<<std::endl;
    
    // taskPtr2关联指针的所有权现在转移到了taskPtr4中
    if(taskPtr4 != nullptr)
    	std::cout<<"taskPtr4 is not empty"<<std::endl;
    
    // 会输出55
    std::cout<< taskPtr4->mId << std::endl;
    

    std::move() 将把 taskPtr2 转换为一个右值引用。因此,调用 unique_ptr 的移动构造函数,并将关联的原始指针传输到 taskPtr4。在转移完原始指针的所有权后, taskPtr2将变为空。

    释放关联的原始指针

    在 unique_ptr 对象上调用 release()将释放其关联的原始指针的所有权,并返回原始指针。这里是释放所有权,并没有delete原始指针,reset()会delete原始指针。

    std::unique_ptr<Task> taskPtr5(new Task(55));
    // 不为空
    if(taskPtr5 != nullptr)
    	std::cout<<"taskPtr5 is not empty"<<std::endl;
    // 释放关联指针的所有权
    Task * ptr = taskPtr5.release();
    // 现在为空
    if(taskPtr5 == nullptr)
    	std::cout<<"taskPtr5 is empty"<<std::endl;
    

    完整示例程序

    #include <iostream>
    #include <memory>
    
    struct Task {
        int mId;
        Task(int id ) :mId(id) {
            std::cout<<"Task::Constructor"<<std::endl;
        }
        ~Task() {
            std::cout<<"Task::Destructor"<<std::endl;
        }
    };
    
    int main()
    {
        // 空对象 unique_ptr
        std::unique_ptr<int> ptr1;
    
        // 检查 ptr1 是否为空
        if(!ptr1)
            std::cout<<"ptr1 is empty"<<std::endl;
    
        // 检查 ptr1 是否为空
        if(ptr1 == nullptr)
            std::cout<<"ptr1 is empty"<<std::endl;
    
        // 不能通过赋值初始化unique_ptr
        // std::unique_ptr<Task> taskPtr2 = new Task(); // Compile Error
    
        // 通过原始指针创建 unique_ptr
        std::unique_ptr<Task> taskPtr(new Task(23));
    
        // 检查 taskPtr 是否为空
        if(taskPtr != nullptr)
            std::cout<<"taskPtr is  not empty"<<std::endl;
    
        // 访问 unique_ptr关联指针的成员
        std::cout<<taskPtr->mId<<std::endl;
    
        std::cout<<"Reset the taskPtr"<<std::endl;
        // 重置 unique_ptr 为空,将删除关联的原始指针
        taskPtr.reset();
    
        // 检查是否为空 / 检查有没有关联的原始指针
        if(taskPtr == nullptr)
            std::cout<<"taskPtr is  empty"<<std::endl;
    
        // 通过原始指针创建 unique_ptr
        std::unique_ptr<Task> taskPtr2(new Task(55));
    
        if(taskPtr2 != nullptr)
            std::cout<<"taskPtr2 is  not empty"<<std::endl;
    
        // unique_ptr 对象不能复制
        //taskPtr = taskPtr2; //compile error
        //std::unique_ptr<Task> taskPtr3 = taskPtr2;
    
        {
            // 转移所有权(把unique_ptr中的指针转移到另一个unique_ptr中)
            std::unique_ptr<Task> taskPtr4 = std::move(taskPtr2);
            // 转移后为空
            if(taskPtr2 == nullptr)
                std::cout << "taskPtr2 is  empty" << std::endl;
            // 转进来后非空
            if(taskPtr4 != nullptr)
                std::cout<<"taskPtr4 is not empty"<<std::endl;
    
            std::cout << taskPtr4->mId << std::endl;
    
            //taskPtr4 超出下面这个括号的作用于将delete其关联的指针
        }
    
        std::unique_ptr<Task> taskPtr5(new Task(66));
    
        if(taskPtr5 != nullptr)
            std::cout << "taskPtr5 is not empty" << std::endl;
    
        // 释放所有权
        Task * ptr = taskPtr5.release();
    
        if(taskPtr5 == nullptr)
            std::cout << "taskPtr5 is empty" << std::endl;
    
        std::cout << ptr->mId << std::endl;
    
        delete ptr;
    
        return 0;
    }
    

    输出:

    ptr1 is empty
    ptr1 is empty
    Task::Constructor
    taskPtr is  not empty
    23
    Reset the taskPtr
    Task::Destructor
    taskPtr is  empty
    Task::Constructor
    taskPtr2 is  not empty
    taskPtr2 is  empty
    taskPtr4 is not empty
    55
    Task::Destructor
    Task::Constructor
    taskPtr5 is not empty
    taskPtr5 is empty
    66
    Task::Destructor
    

    总结

    new出来的对象是位于堆内存上的,必须调用delete才能释放其内存。
    unique_ptr 是一个装指针的容器,且拥有关联指针的唯一所有权,作为普通变量使用时系统分配对象到栈内存上,超出作用域时会自动析构,unique_ptr对象的析构函数中会delete其关联指针,这样就相当于替我们执行了delete堆内存上的对象。

    成员函数作用
    reset()重置unique_ptr为空,delete其关联的指针。
    release()不delete关联指针,并返回关联指针。释放关联指针的所有权,unique_ptr为空。
    get()仅仅返回关联指针

    unique_ptr不能直接复制,必须使用std::move()转移其管理的指针,转移后原 unique_ptr 为空。std::unique_ptr<Task> taskPtr4 = std::move(taskPtr2);

    创建unique_ptr对象有两种方法:

    //C++11: 
    std::unique_ptr<Task> taskPtr(new Task(23));
    //C++14: 
    std::unique_ptr<Task> taskPtr = std::make_unique<Task>(34);
    
    展开全文
  • SQL UNIQUE 约束

    2020-12-16 16:28:59
    SQL UNIQUE 约束 SQL UNIQUE 约束 UNIQUE 约束唯一标识数据库表中的每条记录。 UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。 PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。 请注意,每个表可以...
  • findunique:findunique-源码

    2021-05-15 11:47:20
    #findunique 这段代码基本上是为了在1000行之间搜索唯一行。 代码使用三种方法来影响唯一行。 根据位置 基于关键字 基于正则表达式 ##在职的 代码从用户那里得到三个输入,它们的源文件,句柄和单词的位置出现在...
  • pandas 之unique()函数与nunique()函数区别

    万次阅读 多人点赞 2019-06-23 13:50:10
    很多功能函数自己试一试就全知道了,开始看别人的代码一直不太清楚两者的区别,总是模糊的以为它俩是一样的,是获取...nunique()Return number of unique elements in the object.即返回的是唯一值的个数 例如: ...

    很多功能函数自己试一试就全知道了,开始看别人的代码一直不太清楚两者的区别,总是模糊的以为它俩是一样的,是获取唯一值。

    其实从名字就能看出区别:

    unique()是以 数组形式(numpy.ndarray)返回列的所有唯一值(特征的所有唯一值)

    nunique() Return number of unique elements in the object.即返回的是唯一值的个数

    例如:

     

    例子很简单,关键是要说明,有什么疑问,最好的解决方法是亲手实验!!

    展开全文
  • oracle创建unique和删除unique

    千次阅读 2019-07-31 15:33:18
    创建unique和删除unique alter table ONEENTERPRISEONEFILE drop unique(name);--删除原来name列的索引 alter table ONEENTERPRISEONEFILE add constraint ENTERPRISESID_UNIQUE unique (name,address);--创建name...

    创建unique和删除unique

    alter table ONEENTERPRISEONEFILE drop unique(name);--删除原来name列的索引
    alter table ONEENTERPRISEONEFILE add constraint ENTERPRISESID_UNIQUE unique (name,address);--创建name和address列的联合索引

    展开全文
  • Python教程:unique()与nunique()函数.pdf
  • 主要给大家介绍了关于mongoose数据库设置unique不生效问题的解决方法,以及Mongoose如何移除unique限制的方法示例,文中通过示例代码介绍的非常详细,需要的朋友们可以参考借鉴,下面随着小编来一起学习学习吧。
  • UNIQUE 约束

    2017-08-06 12:31:45
    可以使用 UNIQUE 约束确保在非主键列中不输入重复的值。尽管 UNIQUE 约束和 PRIMARY KEY 约束都强制唯一性,但想要强制一列或多列组合(不是主键)的唯一性时应使用 UNIQUE 约束而不是 PRIMARY KEY 约束。 可以对一...
    可以使用 UNIQUE 约束确保在非主键列中不输入重复的值。尽管 UNIQUE 约束和 PRIMARY KEY 约束都强制唯一性,但想要强制一列或多列组合(不是主键)的唯一性时应使用 UNIQUE 约束而不是 PRIMARY KEY 约束。
    
    可以对一个表定义多个 UNIQUE 约束,但只能定义一个 PRIMARY KEY 约束。
    
    而且,UNIQUE 约束允许 NULL 值,这一点与 PRIMARY KEY 约束不同。不过,当与参与 UNIQUE 约束的任何值一起使用时,每列只允许一个空值。
    
    FOREIGN KEY 约束可以引用 UNIQUE 约束。
    展开全文
  • matlab中的unique

    万次阅读 2014-04-14 23:17:40
    随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、博主微信(guyun297890152)、QQ技术交流群(183198395)。...1、b = unique(A) 返回的是和A中一样的值...
  • Unique函数】Unique函数用法

    千次阅读 2019-07-31 11:57:41
    unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情况,下面会讲)。由于它...
  • unique函数

    千次阅读 2019-01-25 16:13:58
    在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,...
  • unique-identification-源码

    2021-04-01 02:57:25
    unique-identification
  • Define-uniqueid 是一个顺序的、唯一的 id 生成器,可以附加到任意对象原型。 我们认为以下是它相对于替代方案的优势: 可移植性- 它适用于所有不同的 JavaScript 模块格式。 效率- uniqueId是按需生成的。 这可以...
  • unique和nunique的区别

    2019-08-03 20:02:18
    简单明了: 以kaggle的 Intermediate ...unique() 统计list、series中的不同值的个数,返回的是list. nunique() 可直接统计dataframe中每列的不同值的个数,也可用于series,但不能用于list.返回的是不同值的个数. ...
  • index unique scan.pdf

    2021-09-14 11:39:07
    index unique scan.pdf
  • unique_resource,用于独家所有权资源管理的通用 RAII 包装器。 这是使用 Boost 软件许可证 1.0 的 unique_resource 实现。 此实现基于 C++ 标准委员会论文中的示例实现。 什么是 unique_resource unique_resource...
  • primary key、unique和 not null unique区别

    千次阅读 2020-07-05 23:07:31
    primary key 和unique区别 unique 可空,可以在一个表里的一个或多个字段定义;primary key不可空不可重复,在一个表里可以定义联合主键; 简单的说,primary key = unique + not null unique 就是唯一,当你需要...
  • A unique rural school environment Prvchologv in rhe Schoolr Volume 20, January. 1983 A UNIQUE RURAL SCHOOL ENVIRONMENT DIANE M. DODENDORF Creighton University An observational study of 34 ...
  • 按照它们首次出现在输入中的顺序返回向量、矩阵或元胞数组的唯一元素。 不像原来的 unique.m 那样对行进行操作。
  • unique 函数

    千次阅读 2014-07-20 07:58:45
    unique()函数是一个去重函数,STL中unique的函数 unique的功能是去除相邻的重复元素(只保留一个),还有一个容易忽视的特性是它并不真正把重复的元素删除。他是c++中的函数,所以头文件要加#include,具体用法如下: ...
  • [SV]SystemVerilog unique array and unique if

    千次阅读 2020-03-26 19:38:24
    SystemVerilog Unique if Unique if evaluates all the conditions parallel. In the following conditions simulator issue a run time error/warning, More than one ...
  • 报错:Warning: Each record in table should have a unique `key` prop,or set `rowKey` to an unique primary key. 解决方法: This one was confusing to me as well, because I was confusing COLUMN ...
  • mysql的unique key.pdf

    2021-09-14 12:55:21
    mysql的unique key.pdf
  • angular-eha.unique 验证两个模型值是否唯一 用法 将模型值与给定对象的属性进行比较。 < input name =" id " ng-model =" first.id " eha-unique =" second " eha-unique-property =" id " > 如果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 608,203
精华内容 243,281
关键字:

unique