unique_ptr <int []>或vector <int>?

hui*_*arc 10 c++ vector unique-ptr

如果你不需要动态增长而且在编译时不知道缓冲区的大小,那么何时应该unique_ptr<int[]>使用而不是vector<int>if呢?

使用vector而不是unique_ptr?有显着的性能损失吗?

How*_*ant 7

如果你处于vector<int>甚至有可能的位置,除了在极端和罕见的情况下,你可能想要使用它.即使这样,自定义类型unique_ptr<int[]>也可能是最好的答案.

那么有什么unique_ptr<int[]>好处呢?:-)

unique_ptr<T[]> 在两种情况下真的很棒:

1. 您需要处理来自某些遗留函数的malloc/free资源,并且您希望以现代异常安全样式执行此操作:

void
foo()
{
    std::unique_ptr<char[], void(*)(void*)> p(strdup("some text"), std::free);
    for (unsigned i = 0; p[i]; ++i)
        std::cout << p[i];
    std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)

2. 在将新[]资源转移到另一个所有者之前,您需要临时保护它:

class X
{
    int* data_;
    std::string name_;

    static void validate(const std::string& nm);
public:
    ~X() {delete [] data_;}

    X(int* data, const std::string& name_of_data)
        : data_(nullptr),
          name_()
    {
        std::unique_ptr<int[]> hold(data);  // noexcept
        name_ = name_of_data;               // might throw
        validate(name_);                    // might throw
        data_ = hold.release();             // noexcept
    }
};
Run Code Online (Sandbox Code Playgroud)

在上面的场景中,X拥有传递给它的指针,无论构造函数是否成功.此特定示例假定未强制使用noexcept默认构造函数std::string.然而:

  1. 这一点可以归结为不涉及的情况std::string.
  2. std::string抛出的默认构造函数是蹩脚的.


Dav*_*eas 5

使用std::vectorvs. 没有性能损失std::unique_ptr<int[]>.但是,替代方案并不完全相同,因为矢量可以增长而指针不能(这可能是优势还是劣势,矢量是否会错误地增长?)

还有其他差异,比如值将在其中初始化std::vector,但如果您new是数组则不会出现这些差异(除非您使用值初始化 ...).

在一天结束时,我个人会选择std::vector<>,但我仍然没有使用C++ 03编写代码std::unique_ptr.

  • 另外,别忘了“ unique_ptr”方法没有尺寸信息。 (3认同)

Har*_*son 5

std::vector存储变量大小和分配数据大小的长度以及指向它自己的数据的指针。std::unique_ptr只存储指针,因此使用std::unique_ptr.

还没有人提到 vector 提供了迭代器和函数,而size()unique ptr 没有。因此,如果需要迭代器,请使用std::vector