C++ 在唯一的\u ptr中动态分配的数组上应用std::begin()?

C++ 在唯一的\u ptr中动态分配的数组上应用std::begin()?,c++,c++11,C++,C++11,我在动态分配的数组上有一个唯一指针,如下所示: const int quantity = 6; unique_ptr<int[]> numbers(new int[quantity]); for (auto it = begin(numbers); it != end(numbers); ++it) cout << *it << endl; namespace std { template<typename T> T* begin(

我在动态分配的数组上有一个唯一指针,如下所示:

const int quantity = 6;
unique_ptr<int[]> numbers(new int[quantity]);
for (auto it = begin(numbers); it != end(numbers); ++it)
    cout << *it << endl;
namespace std
{
  template<typename T> T* begin(const std::unique_ptr<T[]> ptr) {return ptr.get();}
}
但我不知道语法是怎么正确的。有办法吗? 或者,我可以使用如下索引:

for (int i = 0; i < quantity; ++i)
    cout << numbers[i] << endl; 
for(int i=0;iCUT< P>在C++中动态分配数组(即:<代码>新[] /代码>的结果)没有大小调整信息。因此,无法获取数组的大小

您可以像这样实现
std::begin

const int quantity = 6;
unique_ptr<int[]> numbers(new int[quantity]);
for (auto it = begin(numbers); it != end(numbers); ++it)
    cout << *it << endl;
namespace std
{
  template<typename T> T* begin(const std::unique_ptr<T[]> ptr) {return ptr.get();}
}
名称空间std
{
模板T*begin(const std::uniqueptrptr){return ptr.get();}
}
但是没有办法实现
end


您是否考虑过使用
std::vector
?有了移动支持,它不应该比数组的
唯一\u ptr
更昂贵。

编译器应该将此原型应用于
std::begin

template< class T, size_t N > 
T* begin( T (&array)[N] );

你不能迭代一个
唯一的\u ptr
,它是一个指针。指针不是范围。他们没有开始也没有结束。你只需要在某个地方使用
数量
。还有,是的,你可以这样初始化:
newint[quantity]()
。你不只是使用向量,有什么特别的原因吗?@GManNickG我认为有一种方法,因为你可以在数组中使用begin()。谢谢你的那一招。这是C++11还是总是可能的?@Cubic我正在处理大量内存泄漏的旧代码,因为所有分配的数组、对象和内容几乎永远不会被删除。所以我开始使用智能指针。我应该尝试对数组使用向量。Thx@Gerrit:我相信初始化表单来自C++03(肯定是在C++11之前)。请注意,
newt[]
确实分配了一个数组,但该表达式的结果只是指向第一个元素的指针;没有尺码信息。现在我知道了。谢谢。计数器部分的定义相同
templateT*end(T(&array)[N])N
,它们都知道大小。编译器是否自行推断
N
?我不必明确地写它:。我将尝试其他两个建议。这里多次提到
向量
:有固定大小的变量吗<代码>数组不起作用,因为我只在运行时(不是编译时)知道大小。对于
int(&)[N]
,它可以得到大小,但是对于
std::unique\u ptr
,或者
int*
,它不能得到大小。我只是说这些类型并不完全相同。因此,除非提供显式类型转换,否则编译器无法推导N。而对于固定大小的数组,
std::vector
正好可以。如果您不习惯使用
push_back()
来追加元素,那么首先只需调用
vector::resize()
,然后就可以通过
array[n]
访问它们。顺便说一句,
vector::data()
可以获取其原始指针,其类型为
T*
,并且必须与旧代码兼容std::unique_ptr numbers{newint[quantity]}?上一个不会尝试使用
delete
而不是
delete[]
@MattYang:我花了一些时间研究了
向量
类型,听了你的建议。你完全正确。那应该最能满足我的需要@巴尔基:是的,我也这么认为。就像我在上面的第一个问题中提到的。是的,你是对的,我的错。请原谅我第一次尝试此表单:)