是否有任何打印2D阵列C 的快捷方式



c 中是否有任何快捷方式来输出2D数组(即除了循环外)吗?STL中是否有特殊功能输出。

好吧,由于您提到了stl函数,因此可以使用带有lambda函数的std :: for_each函数打印2D数组:

#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
    int matrix[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    auto elem_printer = [](int num) { std::cout << num << " "; };
    auto row_printer = [&elem_printer](int (&row)[3]) {
            std::for_each(std::begin(row),std::end(row),elem_printer);
            std::cout << std::endl;
    };  
    std::for_each(std::begin(matrix),std::end(matrix),row_printer);
}

然而,这与循环完全相同,但丑陋。

我有这个用于流的模板,它隐藏了一些丑陋,您可以从可重复使用并处理多个维度中受益。当然,没有在某个地方进行循环的情况下没有办法逃脱:

template <class Stream, size_t depth>
class Pretty
{
    Stream& s;
public:
    Pretty(Stream& s): s(s) {}
    template <size_t d1, typename T>
    Stream& operator <<( T const (&v)[d1])const
    {
        const char* sep = "{";
        for (auto& m : v)
        {
            s << sep << m;
            sep = ", ";
        }
        s << "}";
        return s;
    }
    template <size_t d1, typename T, size_t d2>
    std::ostream& operator <<(T const (&v)[d1][d2])const
    {
      enum {DENT = 4};
      std::string dent (DENT,' ');
      std::string indent(depth*DENT,' ');
      std::string sep = "{n" + indent + dent;
      for (auto& m : v)
      {
          s << sep;   Pretty<Stream,depth+1>(s) << m;
          sep = ",n" + indent + dent;
      }
      s << "n" << indent << "}";
      return s;
    }
};
class PrettyNext
{};
Pretty<std::ostream,0> operator << (std::ostream& s, const PrettyNext&)
{
    return Pretty<std::ostream,0>(s);
}

和用法:

int i [][3][2] = { { {1,2}, {3,4}, {5,6} },{{0}}};
std::cout << "This is a test:n" << PrettyNext() << i << std::endl;

输出是:

This is a test:
{
    {
        {1, 2},
        {3, 4},
        {5, 6}
    },
    {
        {0, 0},
        {0, 0},
        {0, 0}
    }
}

我一直在努力直接在std :: ostream上工作,但是与标准char*处理有碰撞,我无法完全解决。

最新更新