5

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

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,无法尝试。但是我需要处理一些事情吗?)

谢谢!格里特

4

2 回答 2

4

编译器应该将此原型应用于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"));
于 2013-04-14T04:27:34.413 回答
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数组更昂贵。

于 2013-04-14T00:48:03.803 回答