我在动态分配的数组上有一个唯一的指针,如下所示:
const int quantity = 6;
unique_ptr<int[]> numbers(new int[quantity]);
到目前为止这应该是正确的(我认为,模板参数中的[]
很重要,对吧?)。
顺便说一下:是否可以像int some_array[quantity] = {};
这样初始化元素?
现在我试图像这样迭代数组:
for (auto it = begin(numbers); it != end(numbers); ++it)
cout << *it << endl;
但我无法弄清楚,语法是如何正确的。有办法吗? 或者,我可以使用索引,如:
for (int i = 0; i < quantity; ++i)
cout << numbers[i] << endl;
其中一个是首选吗?
(与标题没有直接关系:作为下一步,我想将其减少到基于范围的for循环,但我现在只有VS2010并且不能尝试。但是我需要注意的事情吗?的?)
谢谢!格里特
答案 0 :(得分:3)
在C ++中动态分配的数组(即:new []
的结果)没有大小调整信息。因此,您无法获得数组的大小。
您可以像这样实施std::begin
:
namespace std
{
template<typename T> T* begin(const std::unique_ptr<T[]> ptr) {return ptr.get();}
}
但是没有办法实现end
。
您是否考虑过使用std::vector
?有了移动支持,它不应该比数组的unique_ptr
贵。
答案 1 :(得分:3)
编译器应该将此原型应用于std::begin
:
template< class T, size_t N >
T* begin( T (&array)[N] );
这意味着参数类型为int(&)[N]
,std::unique_ptr
和int *
。如果可以,std::end
如何计算最后一个?
但为什么不直接使用原始指针或STL容器?
const int quantity = 6;
std::unique_ptr<int[]> numbers{new int[quantity]};
// assignment
std::copy_n(numbers.get(), quantity,
std::ostream_iterator<int>(std::cout, "\n"));
const int quantity = 6;
std::vector<int> numbers(quantity, 0);
// assignment
std::copy(cbegin(numbers), cend(numbers),
std::ostream_iterator<int>(std::cout, "\n"));