Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cassert>
- #include <string>
- #include <vector>
- #include <ctime>
- #include <random>
- #include <cmath>
- class Str {
- char* data = nullptr;
- unsigned max_capacity;
- unsigned cur_length;
- void extend() {
- max_capacity *= 2;
- char* buf = new char[max_capacity];
- char* runner = data;
- int pos = 0;
- while (*runner) {
- buf[pos] = *runner;
- runner++;
- pos++;
- }
- delete data;
- data = buf;
- }
- void add(char c) {
- if (cur_length == max_capacity) {
- extend();
- }
- data[cur_length++] = c;
- }
- void add_c_str(const char * str) {
- while (*str) {
- add(*str);
- str++;
- }
- }
- public:
- Str() {
- max_capacity = 200;
- data = new char[max_capacity];
- cur_length = 0;
- }
- ~Str() {
- if (data != nullptr) {
- delete data;
- }
- }
- Str& operator << (const char* value) {
- add_c_str(value);
- return *this;
- }
- Str& operator << (const std::string& s) {
- add_c_str(s.c_str());
- return *this;
- }
- operator const char* () {
- add('\0');
- return data;
- }
- };
- class Str_v {
- std::vector<char> data;
- void add(char c) {
- data.push_back(c);
- }
- void add_c_str(const char * str) {
- while (*str) {
- add(*str);
- str++;
- }
- }
- public:
- Str_v& operator << (const char* value) {
- add_c_str(value);
- return *this;
- }
- Str_v& operator << (const std::string& s) {
- add_c_str(s.c_str());
- return *this;
- }
- operator const char* () {
- add('\0');
- const auto r = &data[0];
- return r;
- }
- };
- int main() {
- size_t str_len = 5;
- size_t len;
- int count = 15;
- while (--count > 0) {
- // Preparing data
- std::vector<std::string> data;
- for (int i = 0; i < str_len; ++i) {
- std::string data_str;
- len = (int)std::sqrt(str_len);
- for (int j = 0; j < len; ++j) {
- data_str.push_back('a' + std::rand() % 26);
- }
- data.push_back(data_str);
- }
- clock_t begin = clock();
- Str_v str_v;
- for (const auto& vx : data) {
- str_v << vx << " ";
- }
- const char * data_v = str_v;
- clock_t end = clock();
- double elapsed_secs_v = double(end - begin) / CLOCKS_PER_SEC;
- begin = clock();
- Str str;
- for (const auto& vx : data) {
- str << vx << " ";
- }
- const char * data_p = str;
- end = clock();
- double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
- int equality = strcmp(data_v, data_p);
- std::cout << "Time for " << str_len << " strings with " << len << "symbols: pointers = " << elapsed_secs << ", vectors = " << elapsed_secs_v << ". Equality: " << equality << '\n';
- //std::cout << "Data: " << data2 << "\n\n";
- str_len *= 2;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement