fork download
  1. #include <iostream>
  2. #include <sstream>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. // Длина UTF-8 строки путём подсчёта начальных байт:
  7. // эти байты имеют двоичный вид XXYYYYYY, где XX — 00, 01 или 11. Байты-продолжения начинаются с 10.
  8. size_t u8_len(const /*string_view*/ string& s)
  9. {
  10. return count_if(s.begin(), s.end(),
  11. [](char c){ return static_cast<uint8_t>(c) >> 6 != 0b10; });
  12. }
  13.  
  14. class trexmerniy_massiv_strok
  15. {
  16. public:
  17. trexmerniy_massiv_strok(size_t shirina, size_t vysota, size_t glubina, const string& filler);
  18. ~trexmerniy_massiv_strok();
  19. string& operator ()(size_t x, size_t y, size_t z) const;
  20. friend ostream& operator <<(ostream& out, const trexmerniy_massiv_strok& m);
  21.  
  22. private:
  23. string* stroki;
  24. size_t shirina, vysota, glubina;
  25. };
  26.  
  27. trexmerniy_massiv_strok::trexmerniy_massiv_strok
  28. (
  29. size_t shirina, size_t vysota, size_t glubina, const string& filler
  30. )
  31. : shirina(shirina), vysota(vysota), glubina(glubina)
  32. {
  33. size_t array_size = glubina * vysota * shirina;
  34. stroki = new string[array_size];
  35. fill(stroki, stroki + array_size, filler);
  36. cout << "Создан массив " << shirina << " × " << vysota << " × " << glubina << " и залит \"" << filler << "\"." << endl;
  37. }
  38.  
  39. trexmerniy_massiv_strok::~trexmerniy_massiv_strok()
  40. {
  41. delete[] stroki;
  42. cout << "Массив уничтожен, расходимся." << endl;
  43. }
  44.  
  45. string& trexmerniy_massiv_strok::operator ()(size_t x, size_t y, size_t z) const
  46. {
  47. return stroki[z * vysota * shirina + y * shirina + x];
  48. }
  49.  
  50. ostream& operator <<(ostream& out, const trexmerniy_massiv_strok& m)
  51. {
  52. for (size_t z = 0; z < m.glubina; z++)
  53. {
  54. if (z > 0) out << endl;
  55. out << "Z = " << z << endl;
  56. for (size_t y = 0; y < m.vysota; y++)
  57. {
  58. if (y > 0) out << endl;
  59. for (size_t x = 0; x < m.shirina; x++)
  60. {
  61. if (x > 0) out << " ";
  62. string& s = m(x, y, z);
  63. string pad(max<ptrdiff_t>(0, 7 - static_cast<ptrdiff_t>(u8_len(s))), ' ');
  64. out << pad << s;
  65. }
  66. }
  67. }
  68. return out;
  69. }
  70.  
  71. int main() {
  72. trexmerniy_massiv_strok m(3, 4, 2, "-");
  73. m(0, 0, 0) = "Этот";
  74. m(1, 0, 0) = "чудный";
  75. m(0, 1, 0) = "ротик";
  76. m(2, 1, 0) = "слишком";
  77. m(0, 0, 1) = "много";
  78. m(2, 1, 1) = "болтает";
  79. cout << m << endl;
  80. return 0;
  81. }
Success #stdin #stdout 0s 4508KB
stdin
Standard input is empty
stdout
Создан массив 3 × 4 × 2 и залит "-".
Z = 0
   Этот  чудный       -
  ротик       - слишком
      -       -       -
      -       -       -
Z = 1
  много       -       -
      -       - болтает
      -       -       -
      -       -       -
Массив уничтожен, расходимся.