【问题标题】:C++11 Using "Range-based for loop" (for each) for dynamic arrayC ++ 11对动态数组使用“基于范围的for循环”(对于每个)
【发布时间】:2014-12-06 18:42:02
【问题描述】:

如果我有一个静态数组,我可以这样做:

int a[] = {1, 2, 3};
for (const auto x: a) {printf("%d\n", x);} 

当我有一个指针 (int* b) 和数组大小 (N) 时,我可以做类似的事情吗?

我宁愿避免定义自己的 begin() 和 end() 函数。

我也不想使用 std::for_each,但它是一个选项。

【问题讨论】:

  • ...一个“旧”的普通 for 循环?
  • 为什么不用std::vector而不是指针和大小作为单独的项目?
  • 不,因为关于命名空间的一个古怪的细节,即使可能循环也不知道动态数组的大小。相关:stackoverflow.com/questions/28242073/…

标签: c++ arrays c++11 foreach std


【解决方案1】:

只需使用类似容器的包装器:

template <typename T>
struct Wrapper
{
    T* ptr;
    std::size_t length;
};

template <typename T>
Wrapper<T> make_wrapper(T* ptr, std::size_t len) {return {ptr, len};}

template <typename T>
T* begin(Wrapper<T> w) {return w.ptr;}

template <typename T>
T* end(Wrapper<T> w) {return begin(w) + w.length;}

用法:

for (auto i : make_wrapper(a, sizeof a / sizeof *a))
    std::cout << i << ", ";**

Demo.

对于 C++1Z,我们希望能够使用 std::array_view 代替。

【讨论】:

  • array_view 将如何使用?
猜你喜欢
  • 2013-04-01
  • 2021-04-08
  • 2011-11-03
  • 1970-01-01
  • 2013-03-23
相关资源
最近更新 更多