Sobes.tech
Middle

C++-də sətirlərlə işləmənin optimallaşdırılması üçün hansı üsullar var?

sobes.tech Süni İntellekt

AI-dan cavab

  1. std::string_view istifadə edərək sətirləri məlumatların kopyalanmaması ilə ötürmək.
  2. <string><algorithm>-dən algoritmlardan (məsələn, find, search) istifadə etmək, əl ilə iterasiya etmək yerinə.
  3. reserve ilə əvvəlcədən yaddaş ayırmaq, sətirin genişlənməsi zamanı yenidən ayırmaların sayını azaltmaq üçün.
  4. std::string içində kiçik sətir optimizasiyası (Small String Optimization - SSO) istifadə etmək (əgər kompilyator dəstəkləyirsə).
  5. Çox sayda sətiri sürətlə birləşdirmək üçün std::stringstream istifadə etmək və ya nəticə sətirinə element-ə-element əlavə etmək, əvvəlcədən yer ayırmaqla.
  6. Xüsusi kitabxanalar istifadə etmək, onlar konkret tapşırıqlar üçün optimallaşdırılıb (məsələn, müntəzəm ifadələr).
  7. Sətirləri statik yaddaşda və ya poolda yerləşdirmək, daimi sətirlərlə işləyərkən dinamik ayırmaları qarşısını almaq.
  8. Güvənli və əsaslandırılmışsa, böyük məlumatların kopyalanması üçün aşağı səviyyəli C tərzi funksiyaları (memcpy, memmove) istifadə etmək.

std::string_view istifadə nümunəsi:

#include <string>
#include <string_view>
#include <iostream>

void print_string(std::string_view sv) {
    std::cout << sv << std::endl;
}

int main() {
    std::string s = "Salam, dünya!";
    print_string(s); // Kopyasız

    const char* c_str = "Başqa bir sətir";
    print_string(c_str); // Həm də kopyasız

    return 0;
}

reserve istifadə nümunəsi:

#include <string>
#include <iostream>

int main() {
    std::string s;
    s.reserve(100); // Əvvəlcədən yer ayır
    for (int i = 0; i < 100; ++i) {
        s += 'a'; // Simvollar əlavə etmək, yenidən ayırmaları minimuma endirmək
    }
    std::cout << "Həcmi: " << s.size() << ", Tutumu: " << s.capacity() << std::endl;
    return 0;
}

Birleştirmə müqayisəsi:

#include <string>
#include <sstream>
#include <iostream>
#include <chrono>

int main() {
    const int count = 1000;
    std::string chunk = "abc";

    // += operatoru ilə birləşdirmə və rezervasiya
    auto start1 = std::chrono::high_resolution_clock::now();
    std::string result1;
    result1.reserve(count * chunk.size()); // Rezervasiya
    for (int i = 0; i < count; ++i) {
        result1 += chunk;
    }
    auto end1 = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed1 = end1 - start1;
    std::cout << "+= (rezervasiya ilə): " << elapsed1.count() << " s" << std::endl;

    // stringstream ilə birləşdirmə
    auto start2 = std::chrono::high_resolution_clock::now();
    std::stringstream ss;
    for (int i = 0; i < count; ++i) {
        ss << chunk;
    }
    std::string result2 = ss.str();
    auto end2 = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed2 = end2 - start2;
    std::cout << "stringstream: " << elapsed2.count() << " s" << std::endl;

    return 0;
}

(Qeyd: Bu metodların performansı istifadə olunan kompilyator və standart kitabxanaya görə dəyişə bilər).