hui*_*arc 10 c++ vector unique-ptr
如果你不需要动态增长而且在编译时不知道缓冲区的大小,那么何时应该unique_ptr<int[]>使用而不是vector<int>if呢?
使用vector而不是unique_ptr?有显着的性能损失吗?
如果你处于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.然而:
std::string.std::string抛出的默认构造函数是蹩脚的.使用std::vectorvs. 没有性能损失std::unique_ptr<int[]>.但是,替代方案并不完全相同,因为矢量可以增长而指针不能(这可能是优势还是劣势,矢量是否会错误地增长?)
还有其他差异,比如值将在其中初始化std::vector,但如果您new是数组则不会出现这些差异(除非您使用值初始化 ...).
在一天结束时,我个人会选择std::vector<>,但我仍然没有使用C++ 03编写代码std::unique_ptr.
std::vector存储变量大小和分配数据大小的长度以及指向它自己的数据的指针。std::unique_ptr只存储指针,因此使用std::unique_ptr.
还没有人提到 vector 提供了迭代器和函数,而size()unique ptr 没有。因此,如果需要迭代器,请使用std::vector