Advertisement
Guest User

Pole v C++ pro předčátečníky a začátečníky

a guest
Jul 23rd, 2020
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.82 KB | None | 0 0
  1. /*
  2. (a) clang++ -Wall -Wextra -Wno-vla{,-extension} -pedantic -march=native -O3 \
  3.             -std=c++17 ./array.c++ -Wfatal-errors -o array
  4. (b) g++ -Wall -Wextra -Wno-vla{,-extension} -pedantic -march=native -O3 \
  5.         -std=c++17 ./array.c++ -Wfatal-errors -o array
  6. */
  7.  
  8. #include <cstdint>
  9. #include <cstdlib>
  10. #include <iostream>
  11. #include <memory>
  12. #include <vector>
  13.  
  14. namespace {
  15.  
  16. // Archaická metoda z C; lépe nepoužívat! Jen ukákza zoufalství.
  17. void a(const size_t array_size) {
  18.   int32_t *const array{
  19.       static_cast<int32_t *>(std::malloc(sizeof(int32_t) * array_size))};
  20.   const int32_t *const array_end{array + array_size};
  21.   size_t counter{array_size};
  22.   for (int32_t *p = array; p < array_end; ++p) *p = counter--;
  23.   for (const int32_t *p = array; p < array_end; ++p)
  24.     std::cout << *p << std::endl;
  25.   std::free(array);
  26. }
  27.  
  28. // O fous lepší; inicializace je sice v C, ale iterace je v C++.
  29. void b(const size_t array_size) {
  30.   int32_t *const array{
  31.       static_cast<int32_t *>(std::malloc(sizeof(int32_t) * array_size))};
  32.   size_t counter{array_size};
  33.   for (auto &i : *reinterpret_cast<int32_t(*)[array_size]>(array))
  34.     i = counter--;
  35.   for (auto i : *reinterpret_cast<int32_t(*)[array_size]>(array))
  36.     std::cout << i << std::endl;
  37.   std::free(array);
  38. }
  39.  
  40. // Skoro C++, ale pořád musí se volat delete[], takže nic moc.
  41. void c(const size_t array_size) {
  42.   int32_t *const array{new int32_t[array_size]};
  43.   size_t counter{array_size};
  44.   for (auto &i : *reinterpret_cast<int32_t(*)[array_size]>(array))
  45.     i = counter--;
  46.   for (auto i : *reinterpret_cast<int32_t(*)[array_size]>(array))
  47.     std::cout << i << std::endl;
  48.   delete[] array;
  49. }
  50.  
  51. // Předchozí trik, jen snáze zapsaný -> kvůli potížím s C++ standardem nic moc.
  52. #ifdef __GNUC__
  53. void d(const size_t array_size) {
  54. #ifdef __llvm__
  55.   int32_t(*array)[array_size];
  56.   *reinterpret_cast<void **>(&array) = new int32_t[array_size];
  57. #else
  58.   int32_t(*const array)[array_size]{
  59.       reinterpret_cast<int32_t(*)[array_size]>(new int32_t[array_size])};
  60. #endif
  61.   size_t counter{array_size};
  62.   for (auto &i : *array) i = counter--;
  63.   for (const auto &i : *array) std::cout << i << std::endl;
  64.   delete[] array;
  65. }
  66. #endif
  67.  
  68. // Něco malinko rozumnějšího, konečně.
  69. void e(const size_t array_size) {
  70.   std::unique_ptr<int32_t[]> array{new int32_t[array_size]};
  71.   const int32_t *const array_end{array.get() + array_size};
  72.   size_t counter{array_size};
  73.   for (int32_t *p = array.get(); p < array_end; ++p) *p = counter--;
  74.   for (const int32_t *p = array.get(); p < array_end; ++p)
  75.     std::cout << *p << std::endl;
  76. }  // Ha! Tady se to samo dealokuje.
  77.  
  78. // Kombinace předchozích rádoby-poznatků:
  79. void f(const size_t array_size) {
  80.   std::unique_ptr<int32_t[]> array{new int32_t[array_size]};
  81.   size_t counter{array_size};
  82.   for (auto &i : *reinterpret_cast<int32_t(*)[array_size]>(array.get()))
  83.     i = counter--;
  84.   for (auto i : *reinterpret_cast<int32_t(*)[array_size]>(array.get()))
  85.     std::cout << i << std::endl;
  86. }  // Pche! Nemusí se nic explicitně dealokovat!
  87.  
  88. // Tak. A teď konečně standardní (kni)hovna bez zbytečných nesmyslů.
  89. void g(const size_t array_size) {
  90.   std::vector<int32_t> array(array_size);  // () místo {}? Úkol pro čtenáře!
  91.   size_t counter{array_size};
  92.   for (auto &i : array) i = counter--;
  93.   for (auto i : array) std::cout << i << std::endl;
  94. }  // Žádná explicitní dealokace; Ředitel Vesmíru se postará.
  95.  
  96. }  // namespace
  97.  
  98. int main() {
  99.   std::cout << "Malost pole: ";
  100.   size_t array_size;
  101.   std::cin >> array_size;
  102.   if (std::cin.fail() || std::cin.get() != '\n') {
  103.     std::cerr << "Hovno, vole.\n";
  104.     return 1;
  105.   }
  106.   a(array_size);
  107.   b(array_size);
  108.   c(array_size);
  109. #ifdef __GNUC__
  110.   d(array_size);
  111. #endif
  112.   e(array_size);
  113.   f(array_size);
  114.   g(array_size);
  115.   return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement