实战c++中的vector系列--vector<unique_ptr<>>赋值给vector<unique_ptr<>>

之前博客讲到 vector可以使用insert方法,将一个vector copy到另一个vector的后面。

之前的博客也讲到过,如果vector容器内部放的是unique_ptr是需要进行所有权转移的。

现在就来八一八如何vector<unique_ptr<>> insert to vector<unique_ptr<>>

如果常规的vector,我们就可以这么使用insert:

// inserting into a vector
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (3,100);//100 100 100
  std::vector<int>::iterator it;

  it = myvector.begin();
  it = myvector.insert ( it , 200 );//200 100 100 100

  myvector.insert (it,2,300);//300 300 200 100 100 100

  // "it" no longer valid, get a new one:
  it = myvector.begin();

  std::vector<int> anothervector (2,400);
  myvector.insert (it+2,anothervector.begin(),anothervector.end());
//now, 300 300 400 400 200 100 100 100
  int myarray [] = { 501,502,503 };
  myvector.insert (myvector.begin(), myarray, myarray+3);

  std::cout << "myvector contains:";
  for (it=myvector.begin(); it<myvector.end(); it++)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}
//输出:
501 502 503 300 300 400 400 200 100 100 100

但是对于vector内的unique point来说,就不能简单的使用普通迭代器了:需要使用对迭代器就行std::make_move_iterator操作:

看下英文描述最可靠:
A move_iterator is an iterator adaptor that adapts an iterator (it) so that dereferencing it produces rvalue references (as if std::move was applied), while all other operations behave the same.

就跟我们之前用到的std::move作用是一样一样的~
看看使用例子:

#include <iostream>     // std::cout
#include <iterator>     // std::make_move_iterator
#include <vector>       // std::vector
#include <string>       // std::string
#include <algorithm>    // std::copy

int main () {
  std::vector<std::string> foo (3);
  std::vector<std::string> bar {"one","two","three"};

  std::copy ( make_move_iterator(bar.begin()),
              make_move_iterator(bar.end()),
              foo.begin() );

  // bar now contains unspecified values; clear it:
  bar.clear();

  std::cout << "foo:";
  for (std::string& x : foo) std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}
//输出:
foo: one two three

接下来就是我们的使用了,简单了吧:

#include<iostream>
#include<vector>
#include <memory>
using namespace std;
void display_vector(vector<unique_ptr<int>> &vec);
int main()
{
    vector<unique_ptr<int>> vec;
    unique_ptr<int> s1(new int(1));
    unique_ptr<int> s2(new int(2));
    unique_ptr<int> s3(new int(3));
    unique_ptr<int> s4(new int(4));
    vec.push_back(std::move(s1));
    vec.push_back(std::move(s2));
    vec.push_back(std::move(s3));
    vec.push_back(std::move(s4));


    unique_ptr<int> s5(new int(5));
    vector<unique_ptr<int>> des_vec;
    des_vec.push_back(std::move(s5));
    des_vec.insert(des_vec.end(), std::make_move_iterator(vec.begin()), std::make_move_iterator(vec.end()));
    display_vector(des_vec);    
    cout << "now, des_vec size: " << des_vec.size() << endl;
    cout << "now, vec size: " << vec.size() << endl;

    return 0;
}

void display_vector(vector<unique_ptr<int>> &vec)
{
    for (auto it = vec.begin(); it != vec.end(); it++)
    {
        cout << **it << endl;
    }

//输出结果:
5
1
2
3
4
now, des_vec size: 5
now, vec size: 4
<think>嗯,用户想知道如何在C++中使用unique_ptr<int>。首先,我需要回顾一下unique_ptr的基本概念和用法。根据引用[4],unique_ptr是一个独占所有权的智能指针,当它离开作用域时,会自动释放所管理的内存。所以对于int这样的基本类型,用法应该和其他类型类似。 首先,用户可能需要知道如何声明和初始化一个unique_ptr<int>。比如使用std::make_unique<int>来创建,这是C++14之后推荐的方法,比直接使用new更安全。然后,如何访问指针指向的值,应该用get()方法获取原始指针,或者用解引用操作符*。 接下来,用户可能想知道所有权的转移。因为unique_ptr不能复制,只能移动,所以需要用std::move来转移所有权,比如将一个unique_ptr传递给另一个。引用[1]提到unique_ptr只能移动,不能复制,所以这部分需要重点说明。 还有,用户可能会关心如何释放内存或者重置指针。unique_ptr的release()方法会释放所有权,而reset()会替换管理的对象。这些方法在处理资源时很重要,需要举例说明。 另外,可能的应用场景,比如在容器中存储unique_ptr<int>,或者作为函数参数传递。这时候要注意所有权的转移和生命周期的管理。引用[3]中的比较函数例子可能对用户有帮助,但这里针对的是int,可能不需要那么复杂的结构,但原理类似。 需要提醒用户注意,不能复制unique_ptr,否则会导致编译错误。比如尝试赋值或拷贝构造,这违反了独占所有权的原则。引用[1]和[4]都强调了这一点,所以应该明确告诉用户如何正确使用移动语义。 最后,总结一下基本用法,给出代码示例,并解答用户可能的疑问,比如性能影响、与shared_ptr的区别,以及常见错误。这样用户能全面了解如何使用unique_ptr<int>,并避免常见陷阱。</think>### 如何使用 `unique_ptr<int>` 的详细说明 `std::unique_ptr<int>` 是 C++ 智能指针的一种,用于**独占式管理动态分配的整型内存**。以下是其核心用法及示例: --- #### 1. **基本定义与初始化** - **声明并分配内存**: ```cpp #include <memory> std::unique_ptr<int> ptr = std::make_unique<int>(42); // C++14 推荐方式 ``` - `std::make_unique` 会自动构造 `int` 对象并返回 `unique_ptr`,避免直接使用 `new`[^4]。 - **直接构造**(需显式释放): ```cpp std::unique_ptr<int> ptr(new int(42)); ``` --- #### 2. **访问与操作** - **获取原始指针**: ```cpp int* raw_ptr = ptr.get(); // 不释放所有权,仅获取指针 ``` - **解引用访问值**: ```cpp std::cout << *ptr << std::endl; // 输出 42 ``` - **重置指针**: ```cpp ptr.reset(new int(100)); // 释放原有内存,管理新分配的 int ptr.reset(); // 释放内存并置空 ``` --- #### 3. **所有权转移** - **通过移动语义转移所有权**: ```cpp std::unique_ptr<int> ptr2 = std::move(ptr); // ptr 变为空,ptr2 接管内存 ``` - 此操作符合 `unique_ptr` 的独占性特性[^1]。 --- #### 4. **释放内存** - **主动释放所有权**: ```cpp int* released_ptr = ptr.release(); // 返回原始指针,unique_ptr 不再管理内存 delete released_ptr; // 需手动释放 ``` --- #### 5. **应用场景** - **作为函数返回值**: ```cpp std::unique_ptr<int> create_int(int value) { return std::make_unique<int>(value); } ``` - **容器存储**: ```cpp std::vector<std::unique_ptr<int>> vec; vec.push_back(std::make_unique<int>(10)); ``` --- ### 注意事项 1. **禁止拷贝操作**: 尝试拷贝 `unique_ptr` 会触发编译错误,例如: ```cpp std::unique_ptr<int> ptr3 = ptr; // 错误! ``` 2. **与原始指针混用的风险**: 若通过 `ptr.get()` 获取原始指针后手动 `delete`,会导致重复释放内存。 --- ### 代码示例 ```cpp #include <iostream> #include <memory> int main() { // 创建并初始化 auto num = std::make_unique<int>(42); std::cout << *num << std::endl; // 输出 42 // 所有权转移 auto num2 = std::move(num); if (!num) { std::cout << "num 已失效" << std::endl; } return 0; } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇渡江694

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值