5 Ekim 2017 Perşembe

String Algoritmaları

Giriş
Tüm algoritmalar için şu satırı dahil ederiz.
#include <boost/algorithm/string.hpp>
icontains metodu - ignore case
Elimizde şöyle bir liste olsun
std::list<std::wstring> seeds{ L"google", L"yahoo", L"stackoverflow"};
Bir kelimenin listede olup olmadığını kontrol etmek için şöyle yaparız.
std::wstring testedStr;
for (auto & seed : seeds)
{
  if (boost::icontains(testedStr, seed))
  {
    return true;
  }
}
return false;
iequals metodu - ignore case - string + string
Şöyle yaparız.
std::string a,b = ...;
bool result = boost::iequals (a,b);
iequals metodu - ignore case - string + string + locale 
Şöyle yaparız.
std::u16string str1 = ...;
std::u16string str2 = ...;

// Create the locale
boost::locale::generator gen;
std::locale loc = gen("");

// Try to compare
if (boost::iequals(str1, str2, loc)) {
  std::cout << "EQUAL\n";
} else {
  std::cout << "!EQUAL\n";
}
ifind_first metodu
Açıklaması şöyle. String exception-safety eğer exception fırlatılırsa, hiçbir değişiklik olmamış anlamına gelir.
This function provides the strong exception-safety guarantee
Şöyle yaparız.
typedef const boost::iterator_range<std::string::const_iterator> StringRange;
std::string str1("Hello world");
std::string str2("hello");

if ( boost::ifind_first(
          StringRange(str1.begin(), str1.end()),
          StringRange(str2.begin(), str2.end()) ) ) {
  std::cout << "Found!" << std::endl;
}
join metodu
Şu satırı dahil ederiz.
#include <boost/algorithm/string/join.hpp>
STL veri yapısı ile çalışır. Şöyle yaparız.
std::vector<std::string> list;
std::string joined = boost::algorithm::join (list, ", ");
Range ile çalışır. Şöyle yaparız.
std::string get_keys(const std::map<std::string, std::string>& map) {
  return boost::algorithm::join(
    map | boost::adaptors::map_keys,
    ", ");
}
replace_all metodu
Şu satırı dahil ederiz.
#include <boost/algorithm/string/replace.hpp>
Örnek
Arka arkaya gelen "" karakterlerini tek bir " karakteri ile değiştirmek için şöyle yaparız.
std::string msg("\"Date\"\":1481200838,\"\"Message\"\":\"");
boost::replace_all(msg, "\"\"", "\"");
std::cout << msg << std::endl;
Örnek
Şöyle yaparız.
boost::replace_all(line, "abc", "hij");
replace_all_copy metodu - input + substitude + search string
Örnek
Yeni bir string döner. Şöyle yaparız.
line = boost::replace_all_copy (line,"d","c");
split metodu
Ayraç olarak belirtilen karakterleri kullanır.
Örnek - boost::is_any_of
Şöyle yaparız.
std::vector<std::string> result;
boost::split(result, "string to split", boost::is_any_of("\t "));
Örnek - boost::is_any_of
Şöyle yaparız.
std::string str = "91,43,3,23,0;6,9,0-4,29,24";
std::string delimiters("|,:-;");
std::vector<std::string> result;
boost::split(result, str, boost::is_any_of(delimiters));
Örnek - boost::is_any_of
Backslah  ve t'ye göre ayırma yapmak ve token'ları almamak için şöyle yaparız. .
std::string s(r("\tthis\tis\ta\ttest");
boost::algorithm::split(strs, s, boost::is_any_of("\\t");
Çıktı olarak şunu alırız.
his
is
a
es
Örnek - boost::is_any_of + token_compress_off
Ayraçları da almak istersek şöyle yaparız.
std::vector<std::string> results;
std::string str = "...";
boost::split(
  result,
  str,
  boost::is_any_of("abc"),
  boost::token_compress_off
);
Örnek - boost::is_any_of + token_compress_on
Açıklaması şöyle
Compression compresses adjacent delimiters, it does not avoid empty tokens.
Ayraçları almak istemezsek şöyle yaparız.
std::vector<std::string> result;
boost::split(result, "...", boost::is_any_of(","), boost::algorithm::token_compress_on);
Örnek - lambda
Ayraç olarak "/" karakterini kullanmak için şöyle yaparız.
char* str = ...;

std::vector<std::string> v;

boost::split(v, str, [](char c){return c == '/';});
split ve utf-8
Bu metod sadece byte'lar ile çalışır. utf-8 ile çalışmaz. Açıklaması şöyle
Boost split thinks treats the strings as std::strings: sequences of char: roughly "bytes" (or code units in UTF-8, I believe).

However, many of the code points in the source/pattern are multi-byte characters,
Elimizde çince metin olsun.Bunu düzgün ayıramaz.
std::string src = "使用boost split失败了,不知道什么原因。有人可以告诉我吗?谢谢!";

boost::split(results, src, boost::is_any_of(",.,。"));
to_uppper metodu
Şöyle yaparız.
std::string str (" hello world! ");
boost::to_upper (str);
trim_right metodu
Şöyle yaparız.
std::string str ("hello world! ");
boost::trim_right (str);



Hiç yorum yok:

Yorum Gönder