#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;
// Длина UTF-8 строки путём подсчёта начальных байт:
// эти байты имеют двоичный вид XXYYYYYY, где XX — 00, 01 или 11. Байты-продолжения начинаются с 10.
size_t u8_len(const /*string_view*/ string& s)
{
return count_if(s.begin(), s.end(),
[](char c){ return static_cast<uint8_t>(c) >> 6 != 0b10; });
}
class trexmerniy_massiv_strok
{
public:
trexmerniy_massiv_strok(size_t shirina, size_t vysota, size_t glubina, const string& filler);
~trexmerniy_massiv_strok();
string& operator ()(size_t x, size_t y, size_t z) const;
friend ostream& operator <<(ostream& out, const trexmerniy_massiv_strok& m);
private:
string* stroki;
size_t shirina, vysota, glubina;
};
trexmerniy_massiv_strok::trexmerniy_massiv_strok
(
size_t shirina, size_t vysota, size_t glubina, const string& filler
)
: shirina(shirina), vysota(vysota), glubina(glubina)
{
size_t array_size = glubina * vysota * shirina;
stroki = new string[array_size];
fill(stroki, stroki + array_size, filler);
cout << "Создан массив " << shirina << " × " << vysota << " × " << glubina << " и залит \"" << filler << "\"." << endl;
}
trexmerniy_massiv_strok::~trexmerniy_massiv_strok()
{
delete[] stroki;
cout << "Массив уничтожен, расходимся." << endl;
}
string& trexmerniy_massiv_strok::operator ()(size_t x, size_t y, size_t z) const
{
return stroki[z * vysota * shirina + y * shirina + x];
}
ostream& operator <<(ostream& out, const trexmerniy_massiv_strok& m)
{
for (size_t z = 0; z < m.glubina; z++)
{
if (z > 0) out << endl;
out << "Z = " << z << endl;
for (size_t y = 0; y < m.vysota; y++)
{
if (y > 0) out << endl;
for (size_t x = 0; x < m.shirina; x++)
{
if (x > 0) out << " ";
string& s = m(x, y, z);
string pad(max<ptrdiff_t>(0, 7 - static_cast<ptrdiff_t>(u8_len(s))), ' ');
out << pad << s;
}
}
}
return out;
}
int main() {
trexmerniy_massiv_strok m(3, 4, 2, "-");
m(0, 0, 0) = "Этот";
m(1, 0, 0) = "чудный";
m(0, 1, 0) = "ротик";
m(2, 1, 0) = "слишком";
m(0, 0, 1) = "много";
m(2, 1, 1) = "болтает";
cout << m << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vINCU0LvQuNC90LAgVVRGLTgg0YHRgtGA0L7QutC4INC/0YPRgtGR0Lwg0L/QvtC00YHRh9GR0YLQsCDQvdCw0YfQsNC70YzQvdGL0YUg0LHQsNC50YI6Ci8vINGN0YLQuCDQsdCw0LnRgtGLINC40LzQtdGO0YIg0LTQstC+0LjRh9C90YvQuSDQstC40LQgWFhZWVlZWVksINCz0LTQtSBYWCDigJQgMDAsIDAxINC40LvQuCAxMS4g0JHQsNC50YLRiy3Qv9GA0L7QtNC+0LvQttC10L3QuNGPINC90LDRh9C40L3QsNGO0YLRgdGPINGBIDEwLgpzaXplX3QgdThfbGVuKGNvbnN0IC8qc3RyaW5nX3ZpZXcqLyBzdHJpbmcmIHMpCnsKCXJldHVybiBjb3VudF9pZihzLmJlZ2luKCksIHMuZW5kKCksCgkJW10oY2hhciBjKXsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGMpID4+IDYgIT0gMGIxMDsgfSk7Cn0KCmNsYXNzIHRyZXhtZXJuaXlfbWFzc2l2X3N0cm9rCnsKcHVibGljOgoJdHJleG1lcm5peV9tYXNzaXZfc3Ryb2soc2l6ZV90IHNoaXJpbmEsIHNpemVfdCB2eXNvdGEsIHNpemVfdCBnbHViaW5hLCBjb25zdCBzdHJpbmcmIGZpbGxlcik7Cgl+dHJleG1lcm5peV9tYXNzaXZfc3Ryb2soKTsKCXN0cmluZyYgb3BlcmF0b3IgKCkoc2l6ZV90IHgsIHNpemVfdCB5LCBzaXplX3QgeikgY29uc3Q7CglmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3IgPDwob3N0cmVhbSYgb3V0LCBjb25zdCB0cmV4bWVybml5X21hc3Npdl9zdHJvayYgbSk7Cgpwcml2YXRlOgoJc3RyaW5nKiBzdHJva2k7CglzaXplX3Qgc2hpcmluYSwgdnlzb3RhLCBnbHViaW5hOwp9OwoKdHJleG1lcm5peV9tYXNzaXZfc3Ryb2s6OnRyZXhtZXJuaXlfbWFzc2l2X3N0cm9rCigKCXNpemVfdCBzaGlyaW5hLCBzaXplX3Qgdnlzb3RhLCBzaXplX3QgZ2x1YmluYSwgY29uc3Qgc3RyaW5nJiBmaWxsZXIKKQoJOiBzaGlyaW5hKHNoaXJpbmEpLCB2eXNvdGEodnlzb3RhKSwgZ2x1YmluYShnbHViaW5hKQp7CglzaXplX3QgYXJyYXlfc2l6ZSA9IGdsdWJpbmEgKiB2eXNvdGEgKiBzaGlyaW5hOwoJc3Ryb2tpID0gbmV3IHN0cmluZ1thcnJheV9zaXplXTsKCWZpbGwoc3Ryb2tpLCBzdHJva2kgKyBhcnJheV9zaXplLCBmaWxsZXIpOwoJY291dCA8PCAi0KHQvtC30LTQsNC9INC80LDRgdGB0LjQsiAiIDw8IHNoaXJpbmEgPDwgIiDDlyAiIDw8IHZ5c290YSA8PCAiIMOXICIgPDwgZ2x1YmluYSA8PCAiINC4INC30LDQu9C40YIgXCIiIDw8IGZpbGxlciA8PCAiXCIuIiA8PCBlbmRsOwp9Cgp0cmV4bWVybml5X21hc3Npdl9zdHJvazo6fnRyZXhtZXJuaXlfbWFzc2l2X3N0cm9rKCkKewoJZGVsZXRlW10gc3Ryb2tpOwoJY291dCA8PCAi0JzQsNGB0YHQuNCyINGD0L3QuNGH0YLQvtC20LXQvSwg0YDQsNGB0YXQvtC00LjQvNGB0Y8uIiA8PCBlbmRsOwp9CgpzdHJpbmcmIHRyZXhtZXJuaXlfbWFzc2l2X3N0cm9rOjpvcGVyYXRvciAoKShzaXplX3QgeCwgc2l6ZV90IHksIHNpemVfdCB6KSBjb25zdAp7CglyZXR1cm4gc3Ryb2tpW3ogKiB2eXNvdGEgKiBzaGlyaW5hICsgeSAqIHNoaXJpbmEgKyB4XTsKfQoKb3N0cmVhbSYgb3BlcmF0b3IgPDwob3N0cmVhbSYgb3V0LCBjb25zdCB0cmV4bWVybml5X21hc3Npdl9zdHJvayYgbSkKewoJZm9yIChzaXplX3QgeiA9IDA7IHogPCBtLmdsdWJpbmE7IHorKykKCXsKCQlpZiAoeiA+IDApIG91dCA8PCBlbmRsOwoJCW91dCA8PCAiWiA9ICIgPDwgeiA8PCBlbmRsOwoJCWZvciAoc2l6ZV90IHkgPSAwOyB5IDwgbS52eXNvdGE7IHkrKykKCQl7CgkJCWlmICh5ID4gMCkgb3V0IDw8IGVuZGw7CgkJCWZvciAoc2l6ZV90IHggPSAwOyB4IDwgbS5zaGlyaW5hOyB4KyspCgkJCXsKCQkJCWlmICh4ID4gMCkgb3V0IDw8ICIgIjsKCQkJCXN0cmluZyYgcyA9IG0oeCwgeSwgeik7CgkJCQlzdHJpbmcgcGFkKG1heDxwdHJkaWZmX3Q+KDAsIDcgLSBzdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KHU4X2xlbihzKSkpLCAnICcpOwoJCQkJb3V0IDw8IHBhZCA8PCBzOwoJCQl9CgkJfQoJfQoJcmV0dXJuIG91dDsKfQoKaW50IG1haW4oKSB7Cgl0cmV4bWVybml5X21hc3Npdl9zdHJvayBtKDMsIDQsIDIsICItIik7CgltKDAsIDAsIDApID0gItCt0YLQvtGCIjsKCW0oMSwgMCwgMCkgPSAi0YfRg9C00L3Ri9C5IjsKCW0oMCwgMSwgMCkgPSAi0YDQvtGC0LjQuiI7CgltKDIsIDEsIDApID0gItGB0LvQuNGI0LrQvtC8IjsKCW0oMCwgMCwgMSkgPSAi0LzQvdC+0LPQviI7CgltKDIsIDEsIDEpID0gItCx0L7Qu9GC0LDQtdGCIjsKCWNvdXQgPDwgbSA8PCBlbmRsOwoJcmV0dXJuIDA7Cn0=