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
std::string_viewistifadə edərək sətirləri məlumatların kopyalanmaması ilə ötürmək.<string>və<algorithm>-dən algoritmlardan (məsələn,find,search) istifadə etmək, əl ilə iterasiya etmək yerinə.reserveilə əvvəlcədən yaddaş ayırmaq, sətirin genişlənməsi zamanı yenidən ayırmaların sayını azaltmaq üçün.std::stringiçində kiçik sətir optimizasiyası (Small String Optimization - SSO) istifadə etmək (əgər kompilyator dəstəkləyirsə).- Çox sayda sətiri sürətlə birləşdirmək üçün
std::stringstreamistifadə etmək və ya nəticə sətirinə element-ə-element əlavə etmək, əvvəlcədən yer ayırmaqla. - 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).
- 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.
- 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).