8 Kasım 2019 Cuma

std::string find metodu

Giriş
Açıklaması şöyle.
Return value
Position of the first character of the found substring or npos if no such substring is found.
O(n) bir algoritma yerine Rabi Karp kullanılabilir. Bu algoritma şöyledir
1) Calculate hash of the substring
2) Take a sliding window [equals the size of substring] and compare the hash of the string present in the window to that of substring.
3) If hash matches then we compare window content with the substring.
Dönüş Tipi
Metod std::size_t tipini döner. Yani iterator değil indeks döner. Bu tip unsigned olduğu için dikkatli olmak gerekir. Açıklaması şöyle.
This is because std::string have two interfaces:

- The general iterator based interface found on all containers
- The std::string specific index based interface

std::string::find is part of the index based interface, and therefore returns indices.
Use std::find to use the general iterator based interface.
std::string::npos şöyledir. Yani unsigned bir dönüş tipi için -1 dönülüyor.
static const size_type npos = -1;
Aslında dönüş tipi diğer STL veri yapılarından çok farklı. Örneğin std::map bir iterator döner. Şöyle yaparız
std::map<int, int> myMap = {{1, 2}};
auto it = myMap.find(10);  // it == myMap.end()
String ise indeks döner. Şöyle yaparız.
std::string myStr = "hello";
auto it = myStr.find('!');  // it == std::string::npos
1. size_t'ye atayarak kullanım
Şöyle yaparız.
std::size_t position = str.find('.');
if (position !=  std::string::npos) {...}
Şu kullanım yanlıştır. Bu blok her zaman çalışır.
if (str.find( ".." ) >= 0) {...}
Şu kullanım yanlıştır. Bu blok hiç bir zaman çalışmaz.
if (str.find ('.') < 0) {...}
Şu kullanım çalışır ama bence kötü
if (str.find('.') == -1) {...}
2. int'e atayarak kullanım
Şöyle yaparız.
int position = str.find ("..");
if (position >= 0) {...}
Örnek - find ile substr
Şöyle yaparız
const std::string extracted = src.substr(src.find('d'));
Örnek - find ile split
Find metodu split için şöyle kullanılır. İşlem sonunda string'in sonuna gelmediysek geri kalan karakterlerde sonuca dahil edilir.
const string& str = ...;
std::vector<std::string> values;
size_t pos(0), tmp;
while ((tmp = str.find('.',pos)) != std::string::npos){
  values.push_back(str.substr(pos,tmp-pos));
  pos = tmp+1;
}
if (pos < str.length())
  values.push_back(str.substr(pos));

Hiç yorum yok:

Yorum Gönder