Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. #include <string>
  4. #include <vector>
  5. #include <ctime>
  6. #include <random>
  7. #include <cmath>
  8.  
  9.  
  10. class Str {
  11.     char* data = nullptr;
  12.     unsigned max_capacity;
  13.     unsigned cur_length;
  14.  
  15.     void extend() {
  16.         max_capacity *= 2;
  17.         char* buf = new char[max_capacity];
  18.         char* runner = data;
  19.         int pos = 0;
  20.         while (*runner) {
  21.             buf[pos] = *runner;
  22.             runner++;
  23.             pos++;
  24.         }
  25.         delete data;
  26.         data = buf;
  27.     }
  28.  
  29.     void add(char c) {
  30.         if (cur_length == max_capacity) {
  31.             extend();
  32.         }
  33.         data[cur_length++] = c;
  34.     }
  35.  
  36.     void add_c_str(const char * str) {
  37.  
  38.         while (*str) {
  39.             add(*str);
  40.             str++;
  41.         }
  42.     }
  43.  
  44. public:
  45.  
  46.     Str() {
  47.         max_capacity = 200;
  48.         data = new char[max_capacity];
  49.         cur_length = 0;
  50.     }
  51.  
  52.     ~Str() {
  53.         if (data != nullptr) {
  54.             delete data;
  55.         }
  56.     }
  57.  
  58.     Str& operator << (const char* value) {
  59.         add_c_str(value);
  60.         return *this;
  61.     }
  62.     Str& operator << (const std::string& s) {
  63.         add_c_str(s.c_str());
  64.         return *this;
  65.     }
  66.  
  67.  
  68.     operator const char* () {
  69.         add('\0');
  70.         return data;
  71.     }
  72.  
  73. };
  74.  
  75. class Str_v {
  76.  
  77.     std::vector<char> data;
  78.  
  79.  
  80.     void add(char c) {
  81.         data.push_back(c);
  82.     }
  83.  
  84.     void add_c_str(const char * str) {
  85.  
  86.         while (*str) {
  87.             add(*str);
  88.             str++;
  89.         }
  90.     }
  91.  
  92. public:
  93.  
  94.     Str_v& operator << (const char* value) {
  95.         add_c_str(value);
  96.         return *this;
  97.     }
  98.     Str_v& operator << (const std::string& s) {
  99.         add_c_str(s.c_str());
  100.         return *this;
  101.     }
  102.  
  103.  
  104.     operator const char* () {
  105.         add('\0');
  106.         const auto r = &data[0];
  107.         return r;
  108.     }
  109.  
  110. };
  111.  
  112. int main() {
  113.    
  114.     size_t str_len = 5;
  115.     size_t len;
  116.  
  117.     int count = 15;
  118.  
  119.     while (--count > 0) {
  120.  
  121.         // Preparing data
  122.         std::vector<std::string> data;
  123.         for (int i = 0; i < str_len; ++i) {
  124.             std::string data_str;
  125.             len = (int)std::sqrt(str_len);
  126.             for (int j = 0; j < len; ++j) {
  127.                 data_str.push_back('a' + std::rand() % 26);
  128.             }
  129.             data.push_back(data_str);
  130.         }
  131.  
  132.         clock_t begin = clock();
  133.  
  134.         Str_v str_v;
  135.         for (const auto& vx : data) {
  136.             str_v << vx << " ";
  137.         }
  138.         const char * data_v = str_v;
  139.  
  140.         clock_t end = clock();
  141.         double elapsed_secs_v = double(end - begin) / CLOCKS_PER_SEC;
  142.  
  143.  
  144.  
  145.         begin = clock();
  146.  
  147.         Str str;
  148.         for (const auto& vx : data) {
  149.             str << vx << " ";
  150.         }
  151.         const char * data_p = str;
  152.  
  153.         end = clock();
  154.         double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
  155.  
  156.         int equality = strcmp(data_v, data_p);
  157.  
  158.         std::cout << "Time for " << str_len << " strings with " << len << "symbols: pointers = " << elapsed_secs << ", vectors = " << elapsed_secs_v << ". Equality: " << equality << '\n';
  159.         //std::cout << "Data: " << data2 << "\n\n";
  160.  
  161.  
  162.         str_len *= 2;
  163.     }
  164.  
  165.     return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement