2 Mayıs 2019 Perşembe

STL Reverse Algoritmaları

Giriş
STL algoritmalarını işlevlerine göre gruplamak anlamayı çok daha kolaylaştırıyor. Aşağıdaki algoritmalar dizilyi tersine çevirmeyi gösteriyor.

reverse metodu
Şöyle yaparız.
string foo = "String";    
std::reverse(foo.begin(),foo.end());    
cout << foo << endl;// will output "gnirtS"
Metodun içi muhtemelen şöyle.
template <typename Iterator>
void reverse_any(Iterator left, Iterator right) {
  using std::swap;
  while (left != right) {
    --right;
    if (left == right)
      break;
    swap(*left, *right);
    ++left;
  }
}
reverse_copy metodu
reverse_copy() için verilen hedef bellek yeterince büyük olmalıdır. Eğer değilse tanımsız davranış olablir. Eğer reverse_copy() ile uğraşmak istemiyorsak std::back_inserter() da kullanılabilir. Şöyle yaparız
std::string A = "abc";
std::string B;

std::reverse_copy(A.begin(), A.end(), std::back_inserter(B));
Örnek
Elimizde şöyle bir kod olsun. Bu kod B belleği yeterince büyük olmadığı için tanımsız davranışa sebep olur.
string A = "abc";
string B;
reverse_copy(A.begin(),A.end(),B.begin();
cout<<B<<endl;
//Output: (literally nothing)
Düzeltmek için şöyle yaparız
std::string A = "abc";
std::string B;
B.resize(A.size()); // make B big enough

std::reverse_copy(A.begin(), A.end(), B.begin());

std::cout << B << '\n';
Örnek
Şöyle yaparız.
ba::streambuf response;

std::vector<char> v = ...;
std::reverse_copy(begin(v), end(v), std::ostreambuf_iterator<char>(&response));

Hiç yorum yok:

Yorum Gönder