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;i CUT< 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:我花了一些时间研究了向量
类型,听了你的建议。你完全正确。那应该最能满足我的需要@巴尔基:是的,我也这么认为。就像我在上面的第一个问题中提到的。是的,你是对的,我的错。请原谅我第一次尝试此表单:)